1. 程式人生 > 其它 >LeetCode(力扣)有序陣列的平方之雙指標解法Java

LeetCode(力扣)有序陣列的平方之雙指標解法Java

技術標籤:演算法學習#陣列leetcodejava演算法雙指標資料結構

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

示例 1:
輸入:[-4,-1,0,3,10]
輸出:[0,1,9,16,100]

示例 2:
輸入:[-7,-3,2,3,11]
輸出:[4,9,9,49,121]

思路:
觀察題目,可以發現,因為已知陣列是升序排列的,那也就是說,當原陣列平方後,以0為中心,之前的負數部分是降序排列的,之前的正數部分仍然是升序排列。這也就相當於,平方後,陣列變成了兩頭大中間小的情況,並且是依次從兩頭往中間遞減,因此,可以使用雙指標法解此問題。

具體思路,先建立一個新陣列,然後原陣列平方後,建立兩個指標,分別指向0和length-1,然後依次比較兩指標的數,把較大的放入新陣列末尾,然後如果是左指標較大,就向右移動一位,否則右指標向左移動一位,依次迴圈,直到兩指標碰頭。
在這裡插入圖片描述

程式碼:
需要注意的一點是,我自己犯過的錯誤,while迴圈的判斷需要是<=,我之前寫的是<,結果當左右指標相同時,進不去迴圈,相當於最後少一個數,這個小細節注意一下。

public static int[] sortedSquares(int[] nums) {
        int[] result=new int[nums.length];
        int
left=0; int right=nums.length-1; int index=nums.length-1; while (left<=right){ int l=nums[left]*nums[left]; int r=nums[right]*nums[right]; if(l<r){ result[index]=r; right--; }else { result[
index]=l; left++; } index--; } return result; }