Leetcode数组——977.有序数的平方(双指针)

题目

思路

1. 暴力破解 

先平方,在两个for循环比较排序

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {

        //数据平方
        int length = nums.size();
        //平方
        for(int flagIndex = 0;flagIndex < length;flagIndex++)
        {
            nums[flagIndex] *= nums[flagIndex];
        }


        //排序
        for(int slowIndex = 0;slowIndex < length;slowIndex++)
        {
                for(int fastIndex = 0;fastIndex < length;fastIndex++)
                {
                    if(nums[fastIndex] > nums[slowIndex])
                    {
                        int temp = nums[slowIndex];
                        nums[slowIndex] = nums[fastIndex];
                        nums[fastIndex] = temp;
                    }
                }

        }

        return nums;
    }
};

2. 双指针

明确非递减数组中,经过平方后,最大值只可能出现在头或尾

  • 创建第二个数组nums2,将k指向数组末尾元素,将nums元素从大到小放入nums2中
  • nums中i->头,j->尾,先比较两个数的平方,取大值放入K位置,大的一方移动位置(j--,i++),小的则不变,等待下一次判断
  • i>j时跳出循环
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {

        int i = 0;
        int j = nums.size()-1;
        vector <int> nums2(nums.size(),0);
        int k =nums2.size()-1;

        //i<=j均可进入循环,可能二者位置重叠
        while(i<=j)
        {
            if(nums[i] * nums[i] > nums[j] * nums[j])
            {
                nums2[k] = nums[i] * nums[i];
                i++;
            }
            else
            {
                nums2[k] = nums[j] * nums[j];
                j--;
            }
            k--;
        }

        return nums2;
    }
};

总结

  • 快慢指针和双指针都要考虑到
  • 可能会创建新的数组,按需创建
//与n1大小一样,但初始化数值为0
vector<int>n2(n1.size(),0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值