数组题目索引
文章内容转载自 微信
作者Charlotte77总结了三种一维数组中较为常见的题型:
1. K-sum
这类题目通常会给定一个数组和一个值,让求出这个数组中两个/三个/K个值的和等于这个给定的值target。leetcode第一题就是two-sum,对于这类题目,首先看题目要求的时间复杂度和空间复杂度是什么,其次看有没有限制条件,如要求不能有重复的子数组或者要求按照升序/降序排列等。解法如下:
-
暴力解法:最常见,但是通常会超时,只能作为备选,
-
hash-map:建立一个hash-map循环遍历一次即可
-
two-pointers:定位两个指针根据和的大小来移动另外一个。这里设定的指针个数根据题目中K的个数来定。3Sum中可以设定3个指针,固定两个,移动另一个
2. 区间问题
1)这类题目通常会给一个包含多个子数组的数组,然后针对区间是否重合来判断true or false。
2)学到给二维数组排序:
nums.sort(key = lamda x : x.start) # 按子列表第一个元素来排序
3.子数组类题目
这类题目通常会在一个包含多个子数组的数组中,求和/积,最大最小等。形式有很多种,例如求一个数组中和最小的子数组(209题),或者积最小的子数组(238题)
解法:
1)sliding window 外层for循环使得右边界 right_point 一直遍历
2)当满足条件时,内层while循环不断向右移动左边界 left_point 直到不满足while的判断条件
-
-
例题:209 Minimum Size Subarray Sum[Medium]
-
题目理解:给定我们一个数字,让我们求子数组之和大于等于给定值的最小长度
-
test case:
-
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
解释:满足子数组和=7的最小长度数组是[4,3],所以output=2