因为正负数的数组的平方可能相等,则若直接遍历数组可能造成的结果重复,因此可以采取使用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);
}
}