LeeCode刷题记录2——有序数组的平方
官方解法:双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();//声明变量n为数组的长度
int negative = -1;//先声明一个变量,等下作为负数的位置的指针
for (int i = 0; i < n; ++i) {//查找负数
if (nums[i] < 0) {
negative = i;//用变量negative记录负数的位置
} else {
break;//找不到就跳出循环
}
}
vector<int> ans;//定义函数
int i = negative, j = negative + 1;//定义左指针i,起始位置为最后一个负数的位置,定义右指针j,起始位置为第一个正数的位置
while (i >= 0 || j < n) {
//当左指针或者右指针在数组的范围内时执行循环。
//用循环来形成一个新的栈,当负数的平方小于正数时,负数的平方先入栈,否则正数的平方先入栈。
//当其中左指针或者右指针到底数组边界时,不再进行比较,而是直接让接下来的数入栈。
if (i < 0) {
ans.push_back(nums[j] * nums[j]);
++j;
}
else if (j == n) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else if (nums[i] * nums[i] < nums[j] * nums[j]) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else {
ans.push_back(nums[j] * nums[j]);
++j;
}
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
我参考评论区之后,发现有更为简便的算法:
1.可以减少if的使用,官方使用了四个if,但其实可以只使用两个,这样执行时间和内存占用好像都有减少(好像是,因为我看见比这个内存占用更少的和执行时间更短的算法都是这个思路)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size());
for(int i = 0;i<nums.size();++i)
{
nums[i] = nums[i] * nums[i];//先将数组里面每一个数先平方了
}
int left = 0, right = nums.size()-1;//初始化左指针和右指针的位置为左边界和右边界
int pri = right;//将pri的长度滴定义为n的长度
while(left <= right)
{//当左边界小于右边界时执行循环,每执行一次左右边界就相互靠近,最后生成一个完整的数组res
//如果左指针位置上的数小于右指针位置上的数,则左指针位置上的数先入数组,否则右指针位置上的数先入数组
if(nums[left] <= nums[right])
{
res[pri] = nums[right];
right--;
}
else if(nums[left] > nums[right])
{
res[pri] = nums[left];
left++;
}
pri--;
}
return res;
}
};