因爲正負數的數組的平方可能相等,則若直接遍歷數組可能造成的結果重複,因此可以採取使用set進行去重;也可以採用雙指針的方法,先找到非負數的方法,定義
left:爲負數的最後一個元素,right:爲正數的第一個元素,left指針不斷向前移動,right指針不斷向後移動,
;進行比較判斷即可
package KTwoPointers;
import sun.dc.pr.PRError;
import java.util.*;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/5/7 0007 11:28
* 可以拆分爲合併兩個有序數組
*/
public class Problem977 {
//使用List
//創建一個新的數組,它的每個元素是給定數組對應位置元素的平方
public int[] sortedSquares(int[] A) {
List<Integer> rs = new ArrayList<>();
for(int i=0;i<A.length;i++) {
rs.add(A[i]*A[i]);
}
Collections.sort(rs);
int[] rs1 = new int[rs.size()];
for(int i=0;i<rs.size();i++){
rs1[i]=rs.get(i);
}
return rs1;
}
/**
* y因爲數組A已經排好序了,所以可以說數組中的負數已經按照平方值降序排好了
* 數組中的非負數已經按照平方值升序排好了
*算法:
* 我們可以使用兩個指針分別讀取數組的非負部分與負數部分 —— 指針 i 反向讀取負數部分,指針 j 正向讀取非負數部分。
那麼,現在我們就在使用兩個指針分別讀取兩個遞增的數組了(按元素的平方排序)。接下來,我們可以使用雙指針的技巧合並這兩個數組。
* @param A
* @return
*/
public int[] sortedSquares1(int[] A){
int[] rs = new int[A.length];
int index = 0;
//數組中非負數最後一個(遍歷過程中)
int left = 0;
//數組中整數
int right=0;
//數組中的第一個整數
while(right<A.length&&A[right]<0)
right++;
left=right-1;
while (left>=0&&right<A.length){
if(A[left]*A[left]<A[right]*A[right]){
rs[index++]=A[left]*A[left];
left--;
}else{
rs[index++]=A[right]*A[right];
right++;
}
}
//左右子數組哪邊還有剩餘
if(left>=0){
while (left>=0){
rs[index++]=A[left]*A[left];
left--;
}
}
if(right<A.length){
while (right<A.length){
rs[index++]=A[right]*A[right];
right++;
}
}
return rs;
}
public static void main(String[] args) {
// PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
// priorityQueue.add(21);
// priorityQueue.add(4);
// priorityQueue.add(77);
// priorityQueue.add(3);
// priorityQueue.add(3);
// priorityQueue.add(1);
// System.out.println(priorityQueue);
}
}