每日算法之—排序最短子数组

题目:

给定整形数组nums,求需要排序的最短子数组的长度。

如:nums=[1,5,4,3,2,6,7],

输出结果为4。

解释:只有[5,4,3,2]需要排序,故输出4。

解决办法:

 从前往后和从后往前两次遍历数组。

从前往后遍历时,首先默认首元素为max,当遍历的当前值小于max时,记录下元素位置为p,否则更新max为当前元素。

从后往前遍历时,默认尾元素为min,当遍历的当前值大于min时,记录下元素位置为q,否则更新min为当前元素。

最后输出p-q+1即可。注意:当q=nums.length-1,p=0的情况,此时整个数组是有序的,直接输出0即可。

public class MinUnsortedArrayLen {
	public static void main(String[] args) {
		// int[] nums = new int[] {1,2,4,6,5,3,1,8};
		int[] nums = new int[] { 1,2,3,1 };
		System.out.println(getMinUnsortedArrayLen(nums));
	}

	public static int getMinUnsortedArrayLen(int[] nums) {

		int max = nums[0];
		int min = nums[nums.length - 1];
		int p = 0;
		int q = nums.length - 1;
		for (int i = 0; i < nums.length; i++) {
			if (nums[i] < max) {
				p = i;
			} else {
				max = nums[i];
			}
		}

		for (int i = nums.length - 1; i >= 0; i--) {
			if (nums[i] > min) {
				q = i;
			} else {
				min = nums[i];
			}
		}
		if (p == 0 && q == nums.length - 1) {
			return 0;
		}
		return p - q + 1;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_28044241/article/details/82416847