题目链接:LeetCode977.有序数组的平方
思路:
- 暴力法:将数组每个元素平方后,再排序。
- 双指针法:设置两个指针分别指向数组开头和结尾,比较两边平方后的数。
双指针法:定义一个新数组result,和原数组nums一样大。
定义两个下标l,r。
if nums[l]*nums[l]>num[r]*num[r],result[k--]=nums[l]*nums[l]
if nums[l]*nums[l]<num[r]*num[r],result[k--]=nums[r]*nums[r]
代码实现:
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize=numsSize;
int* result = (int*)malloc(numsSize * sizeof(int));
int k=numsSize-1;
for(int i=0,j=numsSize-1;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
result[k--]=nums[i]*nums[i];
i++;
}
else{
result[k--]=nums[j]*nums[j];
j--;
}
}
return result;
}
总结:
- for循环中判断条件要注意是i<=j,如果是i=j则会漏掉。
- 双指针思路时间复杂度为O(n),优于暴力法。
ps:在写题过程中,碰到一个错误,
之后发现是初始化下标k的时候将numSize写成了returnSize导致出错。改正后测试通过。