uacs2024

导航

leetcode 977. 有序数组的平方

977. 有序数组的平方

法一:双指针,先找负数与非负数的边界

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res;
        if(nums[0] >= 0){//全部非负的情况
            for(int &num : nums)  res.emplace_back(num*num);
            return res;
        }
        int size = nums.size();
        if(nums[size-1] <= 0){//全部非正的情况
            for(int i = size-1;i >= 0;--i)  res.emplace_back(nums[i]*nums[i]);
            return res;
        }
        int flag;
        for(int i = 1;i < size;++i){
            if(nums[i] >= 0){
                flag = i;break;
            }
        }
        int i = flag-1,j = flag;
        while(i >= 0 && j <= size-1){
            while(i >= 0 && j <= size-1 && abs(nums[i]) < abs(nums[j])){
                res.emplace_back(nums[i]*nums[i]);--i;
            }
            while(i >= 0 && j <= size-1 && abs(nums[i]) >= abs(nums[j])){
                res.emplace_back(nums[j]*nums[j]);++j;
            }
        }
        while(i >= 0){
            res.emplace_back(nums[i]*nums[i]);--i;
        }
        while(j <= size-1){
            res.emplace_back(nums[j]*nums[j]);++j;
        }
        return res;
    }
};

法二:不需要找非负边界,直接逆序放入res

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int size = nums.size();
        vector<int> res(size);
        int i = 0, j = size - 1;
        for (int p = size - 1; p >= 0; p--) {
            //将绝对值更大的先倒着放进res
            if(abs(nums[i]) > abs(nums[j])) {
                res[p] = nums[i]*nums[i];
                ++i;
            } else{
                res[p] = nums[j]*nums[j];
                j--;
            }
        }
        return res;
    }
};

 

posted on 2024-12-13 15:25  ᶜʸᵃⁿ  阅读(12)  评论(0)    收藏  举报