返回

给程序员看的LeetCode 977 题:有序数组的平方,用双指针来高效解决!

前端

LeetCode 977:有序数组的平方

问题

给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按 非递减顺序 排序。

解题思路

若要求时间复杂度为 O(n),也就是只能遍历一次,那必须引入新的变量以 空间换时间 来完成题解。

值得注意的是,给定的数组是从 大到小排序完成的 ,也就是说数组中每一项平方后最大的可能只有左指针指向的最大值和右指针指向的最小值平方后的最大值。

因此,我们可以利用双指针的方式,分别指向数组的左右两端,并不断地将较小的元素的平方值放入结果数组中,直到两个指针相遇为止。

具体步骤

  1. 定义两个指针 leftright,分别指向数组的左右两端。
  2. 初始化结果数组 res
  3. 循环,直到 leftright 相遇:
    • 将较小的元素的平方值放入结果数组中,即 res.append(min(nums[left] ** 2, nums[right] ** 2))
    • 如果 nums[left] ** 2 < nums[right] ** 2,则 left += 1
    • 否则,right -= 1
  4. 返回结果数组 res

代码示例

def sorted_squares(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    left, right = 0, len(nums) - 1
    res = []
    while left <= right:
        if abs(nums[left]) < abs(nums[right]):
            res.append(nums[left] ** 2)
            left += 1
        else:
            res.append(nums[right] ** 2)
            right -= 1
    return res[::-1]

# 测试用例
nums1 = [-4, -1, 0, 3, 10]
print(sorted_squares(nums1))  # [0, 1, 9, 16, 100]

nums2 = [-7, -3, 2, 3, 11]
print(sorted_squares(nums2))  # [4, 9, 9, 49, 121]

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。
  • 空间复杂度:O(n),因为我们需要一个新的数组 res 来存储结果。

总结

利用双指针的技巧,我们可以高效地解决 LeetCode 977 题:有序数组的平方。这种技巧在处理有序数组时非常有用,可以帮助我们快速得到想要的结果。