LeetCode977. 有序数组的平方

题目描述

给你一个按 非递减顺序 排序的整数数组 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]

第一次提交的代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){
            nums[i]=nums[i]*nums[i];
        }
        QuickSort(nums,0,nums.length-1);
        return nums;
    }

    public void QuickSort(int[] nums,int low,int high){
        if(low<high){
            int pivotalPosition = Partition(nums,low,high);
            QuickSort(nums,low,pivotalPosition-1);
            QuickSort(nums,pivotalPosition+1,high);
        }
    }

    public int Partition(int[] nums,int low,int high){
        int pivot=nums[low];
        while(low<high){
            while(low<high&&pivot<=nums[high])high--;
            nums[low]=nums[high];
            while(low<high&&pivot>=nums[low])low++;
            nums[high]=nums[low];
        }
        nums[low]=pivot;
        return low;
    }
}

结果
image

学习到的东西

自己提交的第一遍代码击败了多少多少用户,我才从大佬那里知道,这玩意没用- -

先说下自己的算法吧,时间复杂度为O(n)+O(nlogn),题目描述下面写了最好的时间复杂度为O(n)
并且自己的代码提交了多次才通过,原因是对于算法的生疏,快速排序好久没写了,最后的nums[low]=pivot写成了nums[0]=pivot,欠考虑了。

后面看了大佬的解法:双指针法
思想:一个非递减的数组,将当前整个数组作为一个整体可知,最大值一定是最左边或者
最右边索引对应的平方值。所以可以创建一个和原数组相同大小新的数组(!!!!!以后一定不要再将当初考研题目的要求,将空间复杂度看的如此之重!!!当前电子产品的发展,还是要倾向于时间复杂度!),左右指针分别指向原数组的最大索引和最小索引,创建一个新的指针用于指向result数组的最大索引,原数组的两个指针在左右两个方向分别计算平方谁是老大,老大优先进入结果数组的最大索引并将新数组的索引减一,原数组的索引,如果左边的平方为最大,则low++,否则high--,继而将原数组的剩余部分当成一个新的整体,还是那个思想(最大值一定出现在最左边或者最右边的位置)

这个算法的图解地址
最终实现的代码为:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] result=new int[nums.length];
        int low=0;
        int high=nums.length-1;
        int target=nums.length-1;
        while(low<high){
            if(nums[low]*nums[low]<nums[high]*nums[high]){
                result[target--]=nums[high]*nums[high];
                high--;
            }else{
                result[target--]=nums[low]*nums[low];
                low++;
            }
        }
        result[target]=nums[low]*nums[low];
        return result;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值