leetcode经典问题(课程答辩)
1.无重复最长子串问题
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb” 输出: 3
示例 2:
输入: “bbbbb” 输出: 1
示例 3:
输入: “pwwkew” 输出: 3
2.Combination Sum
给定一个无重复元素的数组 candidates 和一个目标数 target ,找 出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。 说明:
所有数字(包括 target)都是正整数。 解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7, 所求解集为:
[
[7],
[2,2,3] ]
示例 2:
输入: candidates = [2,3,5], target = 8, 所求解集为:
[
[2,2,2,2], [2,3,3], [3,5]
]
3.四数之和问题
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否 存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所 有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]
]
思路解析
1.无重复最长子串问题
- 首先要注意,这里不是子序列,不要将问题复杂化。
- 运用滑动窗口思想。
窗口就是一个队列,比如“abcabbc”:进入队列的字符串为“abc”时满足条件,当“a” 进入队列时“abca”此时,不符合条件,记录下上一个符合条件字符串的长度,移动 队列,最左端为刚刚进入队列元素所在位置,重复操作,得到最长子序列长度。
2.Combination Sum
本质上是个深度优先搜索问题,运用回溯法+剪枝思路:以目标 target 为根 结点,依次减去候选队列中的数字,若结果为 0 则为 0 的结果输入到结果集 中。若结果为负数则减枝。
如:输入: candidates = [2,3,6,7], target = 7,
3.四数之和问题
总思路:把 N4 拆成 2 个 N2。
第一个 for 循环,先求后 2 个值可能的取值的所有情 况,并且把它们储存 在一个字典里,以和作为键。
第二个 for,我们遍历前 2 个值所 可能取的各种值,算出和并且检查 target - onesum 是否在我们的字典里,如果在, 就说明我们找到了一个 解。其实这种求几数之和的问题,都可以通过这种思路。比 如说三数之和, 现在我就想到根本不必用指针,算出所有后 2 个值所加的可能的 和,然后 用字典存,最后用 target-第一个值去检查是否存在这样的键。
**
代码实现
**
无重复最长子串问题
def lengthOfLongestSubstring(s: str) -> int: if not s: return 0
left = 0
lookup = set()
n = len(s)
max_len = 0 cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left]) left += 1
cur_len -= 1
if cur_len > max_len: max_len = cur_len
lookup.add(s[i]) return max_len
Combination Sum问题
class Solution(object): #排列函数
def find(self,candidates, tar, start, valueList): #当前目标值 tar==0 时,得出结果
if tar == 0:
Solution.ret.append(valueList) length = len(candidates)
#递归候选队列
for i in range(start, length):
if candidates[i] > tar: return
self.find(candidates, tar - candidates[i], i, valueList + [candidates[i]])
#组合函数
def combin(self, candidates, tar):
candidates.sort()
Solution.ret = [] self.find(candidates, tar, 0, []) return Solution.ret
四数之和
class Solution:
def fourSum(self, nums, target):
lens = len(nums) dic = {}
# 先排序后用集合去重 res = set() nums.sort()
# 先计算前两个数的和
for i in range(lens - 1):
for p in range(i + 1, lens): key = nums[i] + nums[p]
if key not in dic: dic[key] = [(i, p)]
else:
dic[key].append((i, p))
for i in range(2, lens - 1): for p in range(i + 1, lens):
pre = target - nums[i] - nums[p] if pre in dic:
for index in dic[pre]:
# 通过下标判断为合格的后两位数 if index[1] < i:
nums[p]))
res.add((nums[index[0]], nums[index[1]], nums[i], return [list(i) for i in res]
源代码和测试用例可以私聊