题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组、双指针
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
已按非递减顺序排序。
二、解题思路
-
定义左右双指针,结果数组及 index 索引
-
通过双指针遍历数组 A
-
对左右两个指针上的元素进行取绝对值的操作(因为有负数的存在,且负数的平方是正数)
-
对取绝对值后的两个正数进行判断
-
若左指针上的元素大于右指针元素,则左指针上的元素的平方存储到结果数组的 index 索引上,且左指针右移一位
-
否则右指针上的元素的平方存储到结果数组的 index 索引上,且右指针左移一位
三、代码实现
public static int[] sortedSquares(int[] A) {
// 创建数组,存储结果
int[] nums = new int[A.length];
int left = 0;
int right = nums.length - 1;
// 记录往 nums 数组中插入元素的索引
int index = right;
while (left <= right) {
// 取两指针上元素的绝对值
int a = Math.abs(A[left]);
int b = Math.abs(A[right]);
// 进行比较,较大的数存储到结果数组中,相应的指针索引改变
if (a > b) {
nums[index--] = a * a;
left++;
} else {
nums[index--] = b * b;
right--;
}
}
return nums;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[] nums = {-4, -1, 0, 3, 10}; // output: {0, 1, 9, 16, 100}
// int[] nums = {-7, -3, 2, 3, 11}; // output: {4, 9, 9, 49, 121}
int[] result = sortedSquares(nums);
System.out.println(Arrays.toString(result));
}