0
点赞
收藏
分享

微信扫一扫

力扣有序数组的平方【双指针Java】

有点d伤 2022-03-10 阅读 80

文章目录

题目

给你一个按 非递减顺序 排序的整数数组 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]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题

思路

首先明白一个点,非递减顺序,也就是非单调递增,中间可以有重复,例如,5,6,6,7这种,较好考虑的一个思路是暴力解决,将数组每个数平方后赋给原来的数组,在对数组排序,但这样由于排序时间复杂度不为O(n),外加由于有负数,平方后不一定小,所以用考虑用双指针法,双指针在数组中的应用很广泛。用l表示数组最左边下标,用r表示最右边下标,在重新定义一个长度与nums一致的数组,用k指向最右边,通过nums[r]*nums[r]与nums[l]*nums[l]比较,谁大就赋值给nums[k]并且向前或向后移动,直至l>r结束
在这里插入图片描述

双指针(java)

class Solution {
    public int[] sortedSquares(int[] nums) {
        int r = nums.length - 1;
        int l = 0;
        int[] t = new int[nums.length];
        int k = t.length - 1;
        while(l<=r){
            if(nums[l]*nums[l]<nums[r]*nums[r]){
                t[k--] = nums[r]*nums[r];
                r--;
            }
            else{
                t[k--] = nums[l]*nums[l];
                l++;
            }
        }
    return t;
    }
}
举报

相关推荐

0 条评论