知识点
双指针
题目
题解
新数组的长度与旧数组相同,因此先创建一个与旧数组长度相同的数组
设左指针为0,右指针为长度-1,此时右指针为有效值,循环时,数组需要遍历的为数组长度减一
循环中,左指针不断向右移,右指针不断向左移,当左指针小于或等于右指针时,表示数组还未遍历全,继续循环
遍历时,观察头尾平方后的数字,选择大的,放在数组最后
当左侧平方后更大,将左侧平方后数字添加到数组最后,左指针向右移
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int length=nums.size(); //数组长度,5
vector<int> ans(length);
int left=0; //从左边开始
int right=length-1; //从右边开始,4,nums[right]=10
length--; //4
while(left<=right)
{
if((nums[left]*nums[left])>=(nums[right]*nums[right]))
{
ans[length]=nums[left]*nums[left];
left++;
}
else
{
ans[length]=nums[right]*nums[right];
right--;
}
length--;
}
return ans;
}
};
相似题目:88.合并两个有序数组
题目
题解
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int length=m+n-1; //6
int num1=m-1;
int num2=n-1;
while(num1>=0&&num2>=0)
{
if(nums1[num1]>=nums2[num2])
{
nums1[length]=nums1[num1];
num1--;
}
else if(nums1[num1]<nums2[num2])
{
nums1[length]=nums2[num2];
num2--;
}
length--;
}
if(num1<0)
{
while(num2>=0)
{
nums1[num2]=nums2[num2];
num2--;
}
}
}
};