【LeetCode-简单】977. 有序数组的平方-双指针

977. 有序数组的平方
题目:
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

【LeetCode-简单】977. 有序数组的平方-双指针_第1张图片
最简单的方法就是将数组中的数平方后直接排序,时间复杂度是O(n logn)。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            nums[i] *= nums[i];
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};

上述方法没有利用「数组nums 已经按照非降序排序」这个条件。
当 nums 中的每个数都是正数时,平方后数组仍保持非降序;当 nums 中的每个数都是负数时,平方后数组为降序。
因此,可以通过找到负数与非负数之间的分界线,设分界线为 neg ,平方后我们将得到 nums[0] 到 nums[neg] 的降序数组和 nums[neg] 到nums[n-1] 的升序数组这两个有序子数组,下一步,就可以使用归并的方法进行排序了。
使用两个指针分别指向位置 neg 和 neg+1,每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。当某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。
时间复杂度为O(n)。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int neg=-1;
        int n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[i]<0) neg=i;
            else break;
        }
        vector<int> ans;
        int left=neg,right=neg+1;
        while(left>=0||right<n){
            if(right>n-1){
                ans.push_back(nums[left]*nums[left]);
                left--;
            }else if(left<0){
                ans.push_back(nums[right]*nums[right]);
                right++;
            }else if(nums[left]*nums[left]>=nums[right]*nums[right]){
                ans.push_back(nums[right]*nums[right]);
                right++;
            }else{
                ans.push_back(nums[left]*nums[left]);
                left--;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode,双指针)