LeetCode 581-最短無秩序連続サブ配列


整数配列を指定するには、連続したサブ配列を探す必要があります.このサブ配列を昇順ソートすると、配列全体が昇順ソートになります.あなたが見つけたサブ配列は最も短いはずです.その長さを出力してください.————————————————————————————————————————例1:入力:[2,6,4,8,10,9,15]出力:5解釈:[6,4,8,10,9]を昇順ソートするだけで、テーブル全体が昇順ソートになります.入力された配列の長さは[1,10000]です.入力された配列には重複要素が含まれる可能性があるので、昇順は<=を意味します.
方法1:ソート後に比較この方法は簡単で、1つの配列をクローンし、配列をソートした後と元の配列の頭と尾をそれぞれ比較し、一致しないところを見つけるのは再ソートが必要な境界です.方法2:四次循環法の例:[1,3,2,5,7,4,9.左から右サイクルにかけて最初の降順の位置を探し出し、配列は3>2が降順であることを発見したので、左から最初の全体の昇順を満たさない位置は3の下付き、すなわちleft=1である.2.右から左へ循環して最初の昇順の位置を探し出し、配列は4<7が昇順であることを発見したので、右から最初の全体の昇順を満たさない位置は4の下表、すなわちright=5である.3.[left,right]区間で当該区間の最大値と最小値を取得し、それぞれmaxInZoneとminInZone、すなわちmaxInZone=7、minInZone=2と記す.4.全体配列でmaxInZoneとminInZoneの正しい位置を見つける.左から見た最初のminInZoneより大きい数がminInZoneの正しい位置であり、右から見た最初のmaxInZoneより小さい数がmaxInZoneの正しい位置であり、この2つの位置間の距離を計算すればよい.すなわちminInZoneの正確な位置は3の位置であるleft=1であるべきであり、maxInZoneの正確な位置は4の位置であるright=5であるべきであるため、最終的にソートする必要がある区間長は5である.
public int findUnsortedSubarray(int[] nums) {
        if (null == nums || nums.length <= 1) {
            return 0;
        }
        int left = 0, right = 0;
        for (int k = 0; k < nums.length-1; k++) {
            if (nums[k] > nums[k+1]) {
                left=k;
                break;
            }
        }
        for (int k = nums.length-1; k >0; k--) {
            if(nums[k]<nums[k-1]){
                right=k;
                break;
            }
        }

        if(left==right){//         
            return 0;
        }
        int minInZone=Integer.MAX_VALUE,maxInZone= Integer.MIN_VALUE;
        for(int k=left;k<=right;k++){
            if(nums[k]<minInZone){
                minInZone=nums[k];
            }
            if(nums[k]>maxInZone){
                maxInZone=nums[k];
            }
        }
        for(int k=0;k<nums.length;k++){
            if(nums[k]>minInZone){
                left=k;
                break;
            }
        }
        for (int k=nums.length-1;k>=0;k--){
            if(nums[k]<maxInZone){
                right=k;
                break;
            }
        }
        return right-left+1;
    }