977. 有序数组的平方

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

解法一:

思路:最直观的思路莫过于暴力求解,并且这道题的数据量也不是很大,遍历数组nums,将里面的值都更新为平方值,然后利用sorted进行升序排序,返回即可。

这种解法在数据量很大的情况下肯定是效率不高的,因此看下面的解法二。

代码(Python):

class Solution(object):
    def sortedSquares(self, nums):
        for i,num in enumerate(nums):
            nums[i] = num * num
        return sorted(nums)

解法二:

思路:题目已经说明给定的数组是 已按 非递减顺序 排序的,因此原本的数组就是有序的,仔细观察后可以发现,最大值一定是最左边的那个元素的平方或者是最右边的那个元素的平方,那么很自然而然地我们可以想到每次都比较左右边界的两个元素,将更大的那个放到数组中,然后一直往前推,直到两个边界重合。

这就是双指针法,i=0,j=len(nums)-1表示两个边界下标,result存储最后的结果数组,k是result数组的下标,因为我们每次都找最大值,所以k的范围从len(nums)-1到0。当i <=j也就是左右范围还存在的时候,一直循环比较,每次找最大值赋给result,同时更新边界。

代码(Python):

class Solution(object):
    def sortedSquares(self, nums):
        i = 0
        j = len(nums) - 1
        result = [0] * len(nums)
        k = len(nums) - 1
        while i <= j:
            inum = nums[i] ** 2
            jnum = nums[j] ** 2
            if inum <= jnum:
                result[k] = jnum
                j -= 1
            else:
                result[k] = inum
                i += 1
            k -= 1
        return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值