D2 - 977 有序数组的平方

条件:一个按 非递减顺序 排序的整数数组 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:

  1. 不用担心双指针超左右限,只用规定相遇即可(相遇也就是要包括start = end)
  2. 关于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;
    }
};
posted @ 2026-01-04 23:50  SCONLY  阅读(7)  评论(0)    收藏  举报