一、题目
1、审题
2、分析
给定一个无序整形数组,将其变为有序,最少要将连续的多少个元素进行排序。
二、解答
1、思路
① 采用两个指针。 begin 记录需要排序的元素的最低下标; end 记录需要排序的元素的最高下标。
② 顺序遍历数组, 采用变量 max,记录到当前元素为止的最大元素值,若当前元素值 < max ,即此元素需要进行重新排序。采用 end 记录。
③ 逆序遍历数组,采用变量 min,记录到当前元素为止的最小元素值,若当前元素值 > min,即词元素值也需要重新怕徐。采用 begin 记录。
④ 最终需要排序的元素下标序列为 begin ~ end 。 总元素个数为 end - begin +1;
public int findUnsortedSubarray(int[] nums) { int n = nums.length; int begin = -1, end = -2; // 若数组已经有序,则最终的结果 end - begin + 1 == 0 int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; // begin 比 min 大, end 比 max 小 // 找到最后的一个元素, 这个元素从左看比最大的石头小(end 后面的都比最大的数值大) for (int i = 0; i < n; i++) { max = Math.max(max, nums[i]); if(nums[i] < max) end = i; } // 找到最前面的一个元素,这个元素从右看比最小的石头大。(begin 前面的都比最下的数值小) for (int i = n - 1; i >= 0; i--) { min = Math.min(min, nums[i]); if(nums[i] > min) begin = i; } return end - begin + 1; }