LeetCode - 977.有序数组的平方

又是一道双指针的题目,上一篇的双指针是快指针赋值给慢指针(快慢指针赋值),现在这篇是首尾两指针相互比较后,取大的赋值给新的数组。

话不多说,上号: 977.有序数组的平方

题目

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

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]

关键点

  • 原来的数组本来是有序的,因为越往左边越负,越往右边越正,越中间的越靠近0,因此中间的平方是最小的,最左边或者最右边的平方是最大的
  • 用首尾两指针分别计算各自平方后的数,两两比较后取大的放入新数组,新数组的元素从最右边开始往左边排,这就保证了新数组是升序的。
  • 话说是指针,其实都是数字下标,首指针 i 是0,尾指针 j 是数组大小减一(即最后一个元素的下标),还需要新数组的下标 k (也是数组大小减一)
  • 新数组元素赋值后,新数组的下标 k 要往下移一位,占新坑,方便下次循环后首尾指针直接赋值。
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       int k = nums.size()-1;  //新数组的下标 k,一开始指向最右边的位置
       vector<int> result(nums.size(),0); //定义新数组,赋值初始值0
       for(int i =0, j = nums.size()-1; i <= j;){  //注意这个for循环的写法
           if(nums[i] * nums[i] < nums[j] * nums[j]) {
               result[k] = nums[j] * nums[j];
               k--; //新数组完成上面的赋值操作后,往下走一位占新坑
               j--;  //尾指针是往左移的
           }
           else if(nums[i] * nums[i] >= nums[j] * nums[j]){  //注意这里的=是有意义的,就是第一个元素
               result[k] = nums[i] * nums[i];
               k--;  //新数组完成上面的赋值操作后,往下走一位占新坑
               i++;   //首指针是往右移的
           }
       }
       return result;  //返回的是新开辟的数组
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值