从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个按 非递减顺序 排序的整数数组 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.length <= 104-104 <= nums[i] <= 104nums已按 非递减顺序 排序
二、思路分析
这道题同样是用双指针的方法来解决的。双指针算法通常使用两个指针(索引)来遍历数组或链表,这些指针可以指向相同的位置或不同的位置。这两个指针通常被称为"左指针"和"右指针",或"快指针"和"慢指针"。
在双指针算法中,通常需要移动指针,直到找到满足特定条件的位置或值。例如,在数组中查找两个元素的和等于给定值的情况下,可以使用双指针算法。在这种情况下,可以将一个指针指向数组的开头,将另一个指针指向数组的结尾。然后,根据它们指向的元素之和与目标值的大小关系,移动左指针或右指针,直到它们指向的元素之和等于目标值。
在本题中,可以发现数组中最大的值要不就是在数组的最前面取得,要不就是在数组的最后面取得。所以定义了两个双指针,分别从前和从后进行搜索,将得到的最大值添加到新创建的数组的末尾。最后可得结果。
三、AC代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n=nums.size();
vector<int>ans(n,0);
int l=0,r=n-1,sign=n-1;
while(sign>=0){
if(abs(nums[l])>abs(nums[r])){
ans[sign]=nums[l]*nums[l];
l++;
}
else{
ans[sign]=nums[r]*nums[r];
r--;
}
sign--;
}
return ans;
}
};
四、总结
题目比较简单,很容易就做出来了