leetcode代码记录(有序数组的平方

简介: leetcode代码记录(有序数组的平方

1. 题目:


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

2. 我的代码:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        result = [0] * len(nums)
        # 左右指针
        left_i = 0
        right_i = len(nums) - 1

        # 给result赋值
        while left_i <= right_i:
            if nums[left_i] ** 2 > nums[right_i] ** 2:
                result[right_i - left_i] = nums[left_i] ** 2
                left_i += 1
            else:
                result[right_i - left_i] = nums[right_i] ** 2
                right_i -= 1

        return result

有序数组的平方,这里的问题在于不能简单平方,因为-4的平方比3的平方大,会出现顺序的错乱。因此,我们想象一下y = x ^ 2的函数图像,越在两边的函数值越大。我们这时可能会想到,从值为0的地方开始,左右指针向两边扩散。

但是,index(0)时间复杂度n,因此可以选择,不过最好的选择还是从两边开始,向中间靠拢,这样就不需要查询0的位置了。

向中间靠拢需要比较两个元素的平方值,从而确定哪个先向中间移动一下。看代码即可,原理很简单。当然给新数组赋值是从后向前赋值的,对应的索引为:right_i - left_i

目录
相关文章
|
4天前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
9 0
|
4天前
|
算法
leetcode代码记录(全排列 II
leetcode代码记录(全排列 II
13 4
|
4天前
|
算法
leetcode代码记录(全排列
leetcode代码记录(全排列
12 1
|
4天前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
11 1
|
4天前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
9 2
|
4天前
leetcode代码记录(回文数
leetcode代码记录(回文数
12 1
|
4天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
4天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
4天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0
http://www.vxiaotou.com