力扣有序数组的平方题解

力扣有序数组的平方题解

思路

思路一

数组元素全部平方后,再排序

算法时间复杂度是O(logn+n)

思路二

  1. 定义新数组存放平方比较后的值

  2. 使用左右指针思想,分别指向首和尾的元素

  3. 通过移动左右指针比较所有元素

  4. 移动指针比较大小,较大者的数据存放进新数组,新数组从右往左接收数据

思路二的解析

  1. 题目要求排序后的数组大小为从小到大,因此数组接收数据有从右往左和从左往右,前者需接受较大值依次接受次大值;后者反之即可

  2. 本题使用的左右指针(双指针思想),是考虑数组元素存在负数(只存在整数的数组平方后各元素的大小关系没有发生变化),最小的负数平方后可能为最大值,因此我们首先比较最大值,再比较次大值,依次进行,故新数组接受数据是从右往左而不是从左往右。

  3. 或许有同学对不先比较最小值存在疑惑。因为数组中的负数和整数的分界点在哪,我们不知道,虽然我们可以通过库函数或遍历打印,但是计算机不知道。

  4. 但是最大值很好比较,因为数组元素是非递减排序(存在相同的元素,不能称作递增排序),最小值和最大值就位于数组的头和尾,头元素平方后是否是最大值,直接与尾元素比较即可得知。

流程

  1. 定义一个新数组

  2. 定义一个下标k(新数组),下标变化由大到小

疑惑点

  1. for循环中i≤j,而不是i<j。后者会造成剩余一个元素没被处理。

  2. i++和j–。是由执行条件的,因此不能直接在for循环的条件里。他们二者是用来比较指向的数值的大小,谁大则谁移动到另一个元素再比较

代码实现

class Solution {
    public int[] sortedSquares(int[] nums) {

        //定义一个新数组,及其下标
        int[] result=new int[nums.length];
        int index=nums.length-1;

        //循环遍历待处理的数组,双指针思想,left,right,
        for(int left=0,right=nums.length-1;left<=right;){

              //当左指针指向的值大于右指针指向的值,则前者赋值给新数组,左指针右移
              if(nums[left]*nums[left]>nums[right]*nums[right]){
                  result[index--]=nums[left]*nums[left];
                  left++;
              }

                //反之,新数组接收后者,右指针左移
                else{
                    result[index--]=nums[right]*nums[right];
                  right--;
                }                                 
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值