题目
思路
1. 暴力破解
先平方,在两个for循环比较排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//数据平方
int length = nums.size();
//平方
for(int flagIndex = 0;flagIndex < length;flagIndex++)
{
nums[flagIndex] *= nums[flagIndex];
}
//排序
for(int slowIndex = 0;slowIndex < length;slowIndex++)
{
for(int fastIndex = 0;fastIndex < length;fastIndex++)
{
if(nums[fastIndex] > nums[slowIndex])
{
int temp = nums[slowIndex];
nums[slowIndex] = nums[fastIndex];
nums[fastIndex] = temp;
}
}
}
return nums;
}
};
2. 双指针
明确非递减数组中,经过平方后,最大值只可能出现在头或尾
- 创建第二个数组nums2,将k指向数组末尾元素,将nums元素从大到小放入nums2中
- nums中i->头,j->尾,先比较两个数的平方,取大值放入K位置,大的一方移动位置(j--,i++),小的则不变,等待下一次判断
- i>j时跳出循环
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int i = 0;
int j = nums.size()-1;
vector <int> nums2(nums.size(),0);
int k =nums2.size()-1;
//i<=j均可进入循环,可能二者位置重叠
while(i<=j)
{
if(nums[i] * nums[i] > nums[j] * nums[j])
{
nums2[k] = nums[i] * nums[i];
i++;
}
else
{
nums2[k] = nums[j] * nums[j];
j--;
}
k--;
}
return nums2;
}
};
总结
- 快慢指针和双指针都要考虑到
- 可能会创建新的数组,按需创建
//与n1大小一样,但初始化数值为0
vector<int>n2(n1.size(),0)