leetcode 581.最短无序连续子数组

题目:

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

分析:

在我第一次看完这个题目的时候,我就觉得可以用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;n<nums.length;++n){
10             if(is&&nums[n]<nums[n-1]) {
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 }

写的比较长,但是我觉得思路还是比较清晰的,如果看客有更好的做法,欢迎分享。

原文地址:https://www.cnblogs.com/CHAHA123/p/10562843.html