LeetCode977 有序数组的平方

暴力解法是平方之后排序复杂度是n+nlogn
优化解法是双指针i,j,i放数组首元素位置,j放数组末尾,每次比较i和j位置的数组元素大小,然后挑一个大的放在新的数组元素的指定末尾位置上。
当原始数组nums第一个元素大于零时,无需排序,直接平方之后返回nums即可!

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        if(nums[0]>=0){
            for(auto& item: nums){
                item*=item;
            }
            return nums;
        }
        //双指针
        int i,j,k;
        vector<int> ans(nums.size(),0);
        i=0,j=nums.size()-1,k=nums.size()-1;
        for(;i<=j;){
            if(nums[i]*nums[i]<=nums[j]*nums[j]){
                ans[k]=nums[j]*nums[j];
                j--;
                --k;
            }
            else{
                ans[k]=nums[i]*nums[i];
                i++;
                --k;
            }
        }
        return ans;
    }
};

参考链接:(注意看他的动画,秒懂!)
https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html#%E6%80%9D%E8%B7%AF

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