一 题目:
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
二 思路:
双指针法
1.分别在数组的第一个元素nums[0]上定义一个指针j和最后一个元素nums[size-1]位置上定义一个指针p,还有一个结果数组res以及其指针k。
2.两个指针的数组值先平方比较大小nums[i] * nums[i] < nums[j] * nums[j],将大的平方值赋值到结果数组的最后一个位置size-1上,因为一个整数数组的平方最大值只可能在数组的两个端点上,再将j向后移动,p往前移动,结果数组的指针k向前移动,进行同样的比较赋值操作直到遍历结束。
三 代码:
#include <bits/stdc++.h>
using namespace std;
void fun(int nums[], int res[], int size) {
int k = size - 1;
for (int i = 0, j = size - 1; i <= j;) {
if (nums[i] * nums[i] < nums[j] * nums[j]) {
res[k--] = nums[j] * nums[j];
j--;
} else {
res[k--] = nums[i] * nums[i];
i++;
}
}
}
int main() {
int a[6]={-1,0,3,5,9,12};
int size=sizeof(a)/sizeof(a[0]);//普通数组只能用sizeof(a)/sizeof(a[0])求数组长度
int res[size];
fun(a,res,size);
for (int i = 0; i < size; ++i) {
cout<<res[i]<<endl;
}
return 0;
}
四 小结
利用双指针和一个整数数组的平方最大值只可能在数组的两个端点上的规律进行操作。