1. 程式人生 > 其它 >977. 有序陣列的平方【雙指標】

977. 有序陣列的平方【雙指標】

題目

給你一個按 非遞減順序 排序的整數陣列 nums,返回 每個數字的平方 組成的新陣列,要求也按 非遞減順序 排序。

難度:簡單

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非遞減順序 排序

進階:

  • 請你設計時間複雜度為 O(n) 的演算法解決本問題

題解

  • 在提示中的非遞減順序,意思是nums陣列是一個遞增陣列但是不是等量遞增陣列,遞增但是遞增的值不固定。

  • 同時,在進階中,要求我們設計o(n)的演算法,那麼,就不能對陣列的中的負數處理後進行整體陣列的排序。但是題目要求最後的結果陣列是有序的

  • 那麼,我們可以 先對陣列中的負數進行處理,並在處理過程中找到正負數的轉折點

  • 利用雙指標,從轉折點開始往兩邊處理資料,那麼久充分利用了原來陣列的有序性而不需要對陣列進行整體性的排序

class Solution {
    public int[] sortedSquares(int[] nums) {
        //	對原陣列進行處理
        int minIndex = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0) {
                nums[i] = -nums[i];
            }else {
                //	當遇到非負數的時候,就是遇到正負數的轉折點
                break;
            }
            //	找轉折點
            if (nums[i] <= nums[minIndex]) {
                minIndex = i;
            }
        }
        int[] res = new int[nums.length];
        //	雙指標依據轉折點進行處理
        int l = minIndex, r = l + 1, index = 0;
        //	注意迴圈結束的條件
        while (l >= 0 && r < nums.length) {
            if (nums[l] > nums[r]) {
                res[index++] = nums[r] * nums[r];
                r++;
            } else {
                res[index++] = nums[l] * nums[l];
                l--;
            }
        }
        //	對殘餘的資料進行梳理
        while (l >= 0) {
            res[index++] = nums[l] * nums[l];
            l--;
        }
        while (r < nums.length) {
            res[index++] = nums[r] * nums[r];
            r++;
        }
        return res;
    }
}
  • 時間複雜度:o(n),對陣列進行了兩次掃描,與陣列的長度n有關

  • 空間複雜度:o(n),需要與原來陣列同長度的陣列裝結果集,與陣列的長度n有關

結果