对于数组的处理,是leetcode中一种非常常见的题型。针对数组结构的处理,我自己整理了一些常用的解题思路,便于在面对问题时,迅速思索解题方法。
1.滑窗法
2.双指针
3.构建左右侧双列表
4.利用数据结构
1.滑窗法
滑窗法一般用于处理数组中多个数字之间关系。 一般的结构是,一个for循环嵌套一个while循环,并结合max或者min方法进行判断。 相关的题目见上述链接。2.双指针
双指针方法一般有两种应用场景:
- 一种是
左右指针
,即开始时定义左右指针索引。
左右指针中又包含两种方式:
一种是先定义边界后,左加右减。
这种方式广泛应用于二分排序等操作常见用法:二分法常见应用
l,r = 0,len(list)-1
另一种左右指针是以出现的每各index为中轴,左减右加。这种方式运用比较少,可以用于判定字符串中的回文字符串,见密码截取
- 另一种是
快慢指针
,执行逻辑后,两指针一先一后遍历数组,判断是否满足条件。
常见用法:快慢指针法题目汇总
3.构建左右侧双列表
构建左右列表问题,一般需要考虑数组中三个值的关系,例如比较是否递增,中间值是否最小等等。
因此,我们一般会构建两个和原数组等长的数组,按照数组中的每个元素,分别统计其左侧情况与右侧情况,维护其左侧结果和右侧结果。
典型的题目有:
334. 递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
思路:
对于一个长度为3的递增序列,我们只需要考虑数组中的每一个数字左侧是否有数字比其小,右侧是否有数字比其大即可。
这样,我们需要维护两个数组,分别记录原数组中每个数字左侧最小值和右侧最大值。随后,分别对比相同索引位置,是否有:左侧<当前<右侧
。
相应代码如下:
class Solution:
def increasingTriplet(self, nums: List[int]) -> bool:
if len(nums) < 3:
return False
small = [nums[0]]*len(nums)
large = [nums[-1]]*len(nums