雙指針是一種比較常見的算法思想,在循環遍歷數組時常常會用到。雙指針主要有兩種算法技巧:一、快慢指針(例如已發推文中的LeetCode進階-實戰之快慢指針(阿里面試題)),利用指針肯定的相對位置關係,快指針先到達邊界的特色進行搜索;二、雙向指針,雙向指針的特色兩指針分別從前日後和從後往前遍歷,本文介紹的正是這種用法。面試
Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.算法
Example 1:數組
Input: [-4,-1,0,3,10] Output: [0,1,9,16,100] Example 2:bash
Input: [-7,-3,2,3,11] Output: [4,9,9,49,121]ui
Note:編碼
1 <= A.length <= 10000 -10000 <= A[i] <= 10000 A is sorted in non-decreasing order.spa
給定一個按非遞減順序排序的整數數組 A,返回每一個數字的平方組成的新數組,要求也按非遞減順序排序。指針
示例 1:code
輸入:[-4,-1,0,3,10] 輸出:[0,1,9,16,100] 示例 2:cdn
輸入:[-7,-3,2,3,11] 輸出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000 -10000 <= A[i] <= 10000 A 已按非遞減順序排序。
根據題意,數組爲非遞減順序,數組中可能存在負數和非負數。負數在數組中從左到右平方(絕對值)依次變小,正數從右到左平方(絕對值)依次變小。所以採用雙指針分別從左往右、從右往左對比交換。
一、new一個大小與入參大小一致的int數組;
二、聲明兩個指針下標,從左往右的指針和從右往左的指針;
三、for循環,從數組尾下標到起始下標0
i.若從右往左正數絕對值較大則將較大絕對值的數平方放入數組末位,同時從右到左指針左移一位;
ii.若從左往右非正數絕對值較大則將較大絕對值的數放入數組末位,同時從左到右指針右移一位;
四、循環結束,返回新數組的平方數的有序數組;
複製代碼
public int[] sortedSquares(int[] A) {
int n = A.length;
int[] result = new int[n];
int i = 0, j = n - 1;
for (int p = n - 1; p >= 0; p--) {
if (Math.abs(A[i]) > Math.abs(A[j])) {
result[p] = A[i] * A[i++];
} else {
result[p] = A[j] * A[j--];
}
}
return result;
}
複製代碼
本篇介紹了雙指針中比較經典的雙向指針的用法,相對簡單可是比較有表明性適合算法基礎入門。事實上雙向指針在不少經典的算法思想中都有出現,典型的好比快速排序就有用到。最後,若是以爲本篇對你有所幫助,不妨關注走一波~