数组 4. 有序数组的平方

数组 4. 有序数组的平方

977. 有序数组的平方 - 力扣(LeetCode)

代码随想录

  • 思路1: 暴力排序

  • 初始思路代码:

    class Solution:
        def sortedSquares(self, nums: List[int]) -> List[int]:
            sq_nums = [num**2 for num in nums] # square nums
            sq_nums.sort()
            return sq_nums
    
  • 时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度

  • 注意:

    • python中可以利用列表生成式来快速实现题中平方的操作,深入一些,用法有类似:[num**2 for num in nums if num>0]​, pairs = [(x, y) for x in range(3) for y in range(2)]

    • python列表排序方法:list.sort(key=None, reverse=False)​,

      reverse=False​:默认值,表示升序排序。

      reverse=True​:将列表按降序排序。

    • 其他python排序函数:result = sorted(iterable, key=None, reverse=False)​,可以用于任何可迭代对象(iterable)

  • 思路2: 考虑到非递减顺序,左小右大,所以可以尝试用首尾双指针方法。

    • 数组其实是有序的, 只不过负数平方之后可能成为最大数了。

    • 那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

    • 此时可以考虑双指针法了,left​指向起始位置,right​指向终止位置。

    • 定义一个新列表result​,每次添加元素时,都直接添加在列表最前面。

    • 比较left​和right​处的平方大小(实际上可以直接两边加和,如果和大于0,则右边平方更大;如果和等于0,则相等;否则左边平方更大)。

    • 如果left​处平方更大或相等,更新result​并右移left​。

      如果right​处平方更大,更新result​并左移right​。

      left == right​时,进行最后一次操作后终止。

  • 代码:

    class Solution:
        def sortedSquares(self, nums: List[int]) -> List[int]:
            left = 0
            right = len(nums) - 1
            result = []
            while left <= right: # 注意判定条件
                if nums[left] + nums[right] <= 0: # 左平方<=右平方
                    result = [nums[left]**2] + result
                    left += 1
                else:
                    result = [nums[right]**2] + result
                    right -= 1
    
            return result
    
  • 时间复杂度为O(n)

  • 注意 - python中列表:

    • 直接将元素添加在头部的方法:

      1. 使用列表拼接:

        # 示例
        my_list = [2, 3, 4]
        my_list = [1] + my_list
        print(my_list)  # 输出:[1, 2, 3, 4]
        
      2. 使用 insert​ 方法:

        list.insert(index, element)​ 是一种直接向列表指定位置插入数据的方法。

        # 示例
        my_list = [2, 3, 4]
        my_list.insert(0, 1)  # 在列表头部添加元素 1
        print(my_list)  # 输出:[1, 2, 3, 4]
        
    • 开一个固定大小列表的方法:

      res = [float('inf')] * len(nums) # 提前定义列表

你可能感兴趣的:(小白的代码随想录刷题笔记,Mophead的小白刷题笔记,leetcode,代码随想录,数组)