返回

LeetCode 数组篇(下):解锁复杂难题的高阶解法

闲谈

长期以来,LeetCode 数组题凭借其多样性和挑战性,成为众多程序员磨练技能的必经之路。而在数组篇的下篇中,我们将深入探寻更复杂的问题,并解锁一些高阶解法,以助你征服这些难题。

1. 寻找峰值元素

问题: 在一个给定的数组中,存在一个峰值元素,即其左右元素均比它小。找出这个峰值元素的索引。

解法:

二分查找:

  1. 将数组划分为两个子数组,左子数组[left, mid]和右子数组[mid+1, right]。
  2. 比较mid位置的值与left和right位置的值。
  3. 如果mid位置的值大于其左右元素,则它就是峰值元素。
  4. 否则,如果mid位置的值小于left位置的值,则峰值元素在左子数组中;否则,峰值元素在右子数组中。
  5. 重复步骤1-4,直到找到峰值元素。

2. 分组数组

问题: 给定一个整数数组,将其分组为连续子数组,使每个子数组的和相同。

解法:

哈希表:

  1. 使用哈希表记录每个前缀和及其对应的子数组索引。
  2. 遍历数组,计算每个元素的累积和。
  3. 如果累积和与哈希表中任何现有累积和不同,则开始一个新的子数组。
  4. 否则,将当前索引添加到哈希表中已存在累积和对应的子数组索引中。
  5. 最终,返回由哈希表中的值组成的子数组。

3. 最大子序和

问题: 在一个给定的数组中,找到连续子数组,使其和最大。

解法:

动态规划:

  1. 初始化一个数组dp,其中dp[i]表示以第i个元素结尾的连续子数组的最大和。
  2. 遍历数组,对于每个元素:
    • 如果dp[i-1] > 0,则dp[i] = dp[i-1] + nums[i](延续前一个子数组)。
    • 否则,dp[i] = nums[i](开始一个新的子数组)。
  3. 返回dp数组中的最大值。

4. 合并区间

问题: 给定一个包含区间列表的数组,合并所有重叠的区间。

解法:

排序和贪心:

  1. 对区间列表按照起始值进行排序。
  2. 创建一个新的区间列表merged。
  3. 遍历排序后的区间列表,对于每个区间:
    • 如果merged列表为空,或当前区间与merged列表中的最后一个区间不重叠,则将当前区间添加到merged列表。
    • 否则,将当前区间与merged列表中的最后一个区间合并。
  4. 返回merged列表。

5. 三数之和

问题: 给定一个整数数组,找出所有不重复的三元组,它们的和为0。

解法:

双指针:

  1. 排序数组。
  2. 对于每个元素,使用双指针技巧在剩余数组中查找两个元素,使其和为-nums[i]。