力扣977题——双指针法完成非递减数组中元素平方的排序

1.题目描述
2.解题思路
2.1理解题意
2.2解决方法
2.3完整代码
3.小节

1.题目描述:

力扣977题

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

2.解题思路:

2.1理解题意:

从题目中我们知道该数组为非递减数组,我们需要判断数组中所有元素平方后的值大小,再按照从小到大的顺序排列;
该数组为非递减数组,所以数组中的元素平方后的值的大小是按照两边大中间小的规律存在的,且数组中所有元素平方后只是值发生了变化,但是数组中元素的个数还是不变,数组长度还是和原来一样

2.2解决方法:

1.定义两个指针,left和right
left为数组最左侧的边界(也是起始索引):一般开始为0
right为数组最右侧的边界(末端索引):一般由数组长度(nums.length)决定right = nums.length - 1
2.创建一个新数组,新数组的长度为nums.lengthl-1
3.当数组中right位置所对应的值的平方大于left位置所对应的值的平法,将该位置放入新数组中,因为获取的值是需要按照从大到小的顺序排列的,所以每当有一个数被放到新数组中,新数组的索引就需要进行减一操作,初始索引为nums.length-1,然后我们需要将right进行减一操作,继续进行上述循环;
4.当数组中left位置所对应的值的平方大于等于right位置所对应的值的平法,将该位置放入新数组中,因为获取的值是按照从大到小的顺序排列的,所以每当有一个数被放到新数组中,新数组的索引就需要进行减一操作,初始索引为nums.length-1,然后我们需要将left进行加一操作,继续进行上述循环;
5.返回新数组

2.3完整代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        int[] result = new int[nums.length];
        int index = nums.length-1;
        while(left<=right){
            if(nums[right]*nums[right]>nums[left]*nums[left]){
                result[index--]=nums[right]*nums[right];
                right--;
            }else{
                result[index--]=nums[left]*nums[left];
                left++;
            }
        }
        return result;
    }
}

3.小节:

著此篇,与君享,互勉之,共进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值