D2 - 977 有序数组的平方
- 977 有序数组的平方 (力扣:https://leetcode.cn/problems/squares-of-a-sorted-array
条件:一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按非递减顺序排序。(非递减意味着所有都要是前面<=后面)
Tips:自己使用了先算平方再插入排序,注意插入排序的思想是先把当前值存current后,不断用前面的大值向后覆盖,直到前面为小值后把current放上去;注意,判断一定是j>0 && nums[j-1] > current,也就是j>0在前,否则nums[j-1]先算出来nums[-1]会直接显示越界而非false跳出。
代码(只能跑通,速度非常慢):
点击查看代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
if(nums.size() == 1) nums[0] = nums[0]*nums[0];
else{
for(int n = 0; n < nums.size(); n++)
{
nums[n] = nums[n] * nums[n];
int current = nums[n];
int j = n;
for(; j > 0 && nums[j-1] > current ; ){
nums[j] = nums[j-1];
j--;
}
nums[j] = current;
}
}
return nums;
}
};
双指针法,利用原来数列本身非递减特性,即两端分别为最大值,逐渐递减到中间,所以只要双指针分别指向两端挨个比较、将当前最大值推入新数列即可;
Tips:
- 不用担心双指针超左右限,只用规定相遇即可(相遇也就是要包括start = end)
- 关于nums[start] = nums[end]的情况,因为中心思想是保留较大者作为ans新值,那么这个边界条件归给>或<都一样,留下的数进行比较是等效的,不要加=然后处理双倍的a,容易搞混后犯错;
代码:
点击查看代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int s = 0;
int e = nums.size() - 1;
int a = e;
vector<int> ans(e+1);
for( ; s <= e ; --a){
if( nums[s]*nums[s] >= nums[e]*nums[e]){
ans[a] = nums[s]*nums[s];
++s;
}else{
ans[a] = nums[e]*nums[e];
--e;
}
}
return ans;
}
};
浙公网安备 33010602011771号