题目:给定一个非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按照非递减顺序排序。
解题方法:直接排序、双指针(归并方法)、双指针
一、直接排序
直接将数组nnums中的元素平方后排序。
public class Solution {
public static int[] sortSquares(int[] nums) {
int[] result = new int[nums.length];
for(int i = 0;i < nums.length;i++) {
result[i] = nums[i]*nums[i];
}
Arrays.sort(result);
return result;
}
二、双指针(归并方法)
找到数组nums中负数与非负数的分界线,设为mid。nums[0]到nums[mid]均为负数,nums[mid+1]到nums[length-1]非负数。可以使用归并的方法进行排序。
使用两个指针分别指向位置mid、mid+1,每次比较两个指针位置的元素平方值,将较小的值放入答案数组,并更新指针。当某一个指针移动至边界时,将另一个指针还未遍历到的元素放入答案数组中。
public class Solution {
public static int[] sortSquares(int[] nums) {
int[] ans = new int[nums.length];//定义答案数组
int mid = -1;
//寻找分界线
for(int i = 0; i<nums.length; i++) {
if(nums[i] < 0) {
mid = i;
}else {
break;
}
}
int index = 0, i = mid, j = mid + 1;
while(i >= 0 || j < nums.length) {
if(i < 0) {
ans[index] = nums[j]*nums[j];
j++;
}else if(j == nums.length) {
ans[index] = nums[i]*nums[i];
i--;
}else if(nums[i]*nums[i] > nums[j]*nums[j]) {
ans[index] = nums[j]*nums[j];
j++;
}else {
ans[index] = nums[i]*nums[i];
i--;
}
index++;
}
return ans;
}
三、双向指针
分别将两个指针指向位置0和n-1,每次比较两个指针指向的元素,选择较大的元素逆序放入答案数组ans[],直至两个指针指向同一个位置。
public class Solution {
public static int[] sortSquares(int[] nums) {
int left = 0, right = nums.length-1;
int[] ans = new int[nums.length];//定义答案数组
int index = nums.length-1;
while(left <= right) {
if(nums[left]*nums[left] > nums[right]*nums[right]) {
ans[index] = nums[left]*nums[left];
++left;
}else {
ans[index] = nums[right]*nums[right];
right--;
}
--index;
}
return ans;
}