LeetCode第977题 有序数组的平方

该博客介绍了如何在O(n)的时间复杂度内,利用双指针策略解决数组平方后保持非递减顺序的问题。文章首先指出不能使用排序算法,然后提出以第一个正数为界,前半部分逆序,后半部分正序的思路。通过设置两个指针,分别从正数前和正数开始,比较并填充新数组。对于全正数或全负数数组有特殊处理方式。最后给出了详细的Java代码实现。
摘要由CSDN通过智能技术生成
  1. 算法
    双指针
  2. 核心思想
    这道题其实最简单的思路是直接平方以后,找个排序算法一排就可以,可以直接用快排。但是如果要求使用时间复杂度O(n)的算法,那就不能用排序算法,因为即便是快排,时间复杂度也要O(nlogn)。所以要利用非递减顺序这一条件。
    整个数组在平方后以第一个出现的正数为界,前半部分为逆序,后半部分为正序。可以令第一个指针指向正数前面的数字,第二个指针指向第一个正数,依次比较,存入新的数组中。
    如果为全正数数组,直接返回;全负数数组,颠倒顺序返回。
  3. 代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        int sign = -1;
        for(int i = 0;i< nums.length;i++){
            if(nums[i] >= 0 && sign == -1) sign = i;
            nums[i] = (int)Math.pow(nums[i],2);
            
        }
        if(sign == 0) return nums;
        int[] result = new int[nums.length];
        if(sign == -1){
            for(int i = 0;i< nums.length;i++){
                result[i] = nums[nums.length-1-i];
            }
            return result;
        }

        int i = sign-1,j = sign,k = 0;

        while(i >= 0 || j < nums.length){

            if(i < 0){
                result[k++] = nums[j++];
            }else if(j >= nums.length){
                result[k++] = nums[i--];
            }else if(nums[i] >= nums[j]){
                result[k++] = nums[j++];
            }else{
                result[k++] = nums[i--];
            }
        }

        return result;


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值