0
点赞
收藏
分享

微信扫一扫

LeetCode_977 有序数组的平方

大漠雪关山月 2022-02-28 阅读 81

1、题目:有序数组的平方

 

2、解题思路

        如果有正负数的存在,直接平方的话数组会出现两端大中间小的情况,所以我们只需要找到正负数的交界处,然后使用双指针的思想将数据进行从小到大的排序。

但是还有更加巧妙的想法,就是将双指针分别指向数组的首尾的位置,然后也是一样从大到小进行排序,这样就不需要进行寻找正负交界这个步骤。

3、代码

//双指针
class Solution 
{
public:
    vector<int> sortedSquares(vector<int>& nums) 
    {
        //寻找中间值
        int n = nums.size();
        int negative = -1;
        for (int i = 0; i < n; ++i) 
        {
            if (nums[i] < 0) 
            {
                negative = i;
            } 
            else 
            {
                break;
            }
        }

        vector<int> ans;
        int i = negative, j = negative + 1;
        while (i >= 0 || j < n) 
        {
            if (i < 0) 
            {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
            else if (j == n) 
            {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else if (nums[i] * nums[i] < nums[j] * nums[j]) 
            {
                ans.push_back(nums[i] * nums[i]);
                --i;
            }
            else 
            {
                ans.push_back(nums[j] * nums[j]);
                ++j;
            }
        }
        return ans;
    }
};
//双指针优化
class Solution 
{
public:
    vector<int> sortedSquares(vector<int>& nums) 
    {
        int n = nums.size();
        vector<int> ans(n);
        for (int i = 0, j = n - 1, pos = n - 1; i <= j;) 
        {
            if (nums[i] * nums[i] > nums[j] * nums[j]) 
            {
                ans[pos] = nums[i] * nums[i];
                ++i;
            }
            else 
            {
                ans[pos] = nums[j] * nums[j];
                --j;
            }
            --pos;
        }
        return ans;
    }
};
举报

相关推荐

0 条评论