题目:
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
分析:
在我第一次看完这个题目的时候,我就觉得可以用O(n)的时间复杂度完成这个代码,首先他要求是连续的子数组,所以只要是有不符合要求的位置,就用坐标把左右位置标志出来就可以完成了。
过程:
1、如果整个数组都没有倒序的位置或者是数组长度小于2,我就直接返回0。
2、当发现第一个倒序的位置,将is变为false,表示这个数组有倒序的数字,并且将左坐标记下来,并用max记录当前最大值。
3、用max一直向后比较,只要max比当前位置数组中的数字大,说明顺序有问题,将右坐标移动到当前位置。如果max小,那么就用nums数组当前位置数字替换max,继续向后比较。
4、完成这一步骤后,将左右标记范围内最小的数字找出来,从左坐标向前比较,找出首个小于等于它的数字的位置,记录为做坐标,最后返回范围大小。
代码:
1 class Solution{ 2 public int findUnsortedSubarray(int[] nums) { 3 if(nums.length==1) 4 return 0; 5 int max=nums[0]; 6 boolean is=true; 7 int stl=0; 8 int str=0; 9 for(int n=1;nn){ 10 if(is&&nums[n] ]) { 11 is=false; 12 max=nums[n-1]; 13 stl=n-1; 14 } 15 if(max>nums[n]) 16 str=n; 17 else 18 max=nums[n]; 19 System.out.println(n+" "+is+" "+stl+" "+str); 20 } 21 int min=nums[stl+1]; 22 for(int n=stl+1;n<=str;++n) 23 if(nums[n]<=min) 24 min=nums[n]; 25 System.out.println(min); 26 for(int n=stl;n>=0;--n) { 27 if(min>=nums[n]) { 28 stl=n+1; 29 break; 30 } 31 else 32 if(n==0) 33 stl=0; 34 } 35 if(str-stl>0) 36 return (str-stl+1); 37 else 38 return 0; 39 } 40 }
写的比较长,但是我觉得思路还是比较清晰的,如果看客有更好的做法,欢迎分享。