leetcode 581. 最短の順序付けされていない連続部分配列の Java ソリューション

トピックのカテゴリ

分類するとダブルポインタアルゴリズムです。

元のタイトルへのリンク

整数配列 nums を指定すると、連続した部分配列を見つける必要があります。この部分配列を昇順に並べ替えると、配列全体が昇順に並べ替えられます。

質問の意味を満たす最も短い部分配列を見つけて、その長さを出力してください。

コード例: 入力: nums = [2,6,4,8,10,9,15]
出力: 5
説明: [6, 4, 8, 10, 9] を昇順にソートするだけで、その後全体をソートする必要があります。テーブルは昇順にソートされます。

答え

並べ替えられた 2 つの長さを見つけます。まずスキャンを使用して、左側の昇順で最後の点の左側の位置を見つけ、右から左への降順で最後の点の右側の位置を見つけます。この時点ですでにソートされている場合はleft == right、調整する必要はありません。次に、left + 1 の位置から右にスキャンします。 nums[left] より小さい要素がある場合、少なくとも left が正しい位置にないことを意味し、次は left — になります。同様に、right - 1 の位置から左にスキャンします。nums[right] より大きい要素がある場合、少なくとも nums[right] が正しい位置、right ++ にないことを意味します。最後に、左と右の間の要素は並べ替える必要がある要素で、長さは右 - 左 - 1 です。

時間計算量 O(n) 空間計算量 O(1)。

class Solution {
    
    
    public int findUnsortedSubarray(int[] nums) {
    
    
        int n = nums.length ; int left = 0 ; int right = n - 1;
        if(n == 1)return 0 ;
        while(left < n-1 && nums[left+1] >= nums[left]) left++;
        while(right > left && nums[right] >= nums[right - 1])right-- ;
        if(left == right) return 0 ;
        for(int i = left + 1 ;i < n ; i ++){
    
    
            while(left >= 0 && nums[i] < nums[left])left--;
        }
        for(int i = right-1 ; i>= 0 ; i--){
    
    
            while(right <= n -1 && nums[i] >  nums[right]) right++;
        }
        return right - left-1;
    }
}

おすすめ

転載: blog.csdn.net/qq_41810415/article/details/128771274