力扣题目:#216.组合总和III
刷题时长:30min
解题方法:回溯
复杂度分析
- 时间O(n * 2^n)
- 空间O(n)
问题总结
- for循环内的调用的递归函数中,startIndex应为i+1。startIndex(int)为下一层for循环搜索的起始位置。
- 剪枝优化for循环中i的终止边界少加1
本题收获
- 两处剪枝优化
- if sum(path) > targetsum, return
- for i in range(startIndex, 10-(k-len(path))+1)
力扣题目:#17.电话号码的字母组合
刷题时长:参考题解后15min
解题方法:哈希表+回溯
复杂度分析
- 时间O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数
- 空间O(3^m * 4^n)
问题总结
- append答案时没有重新拷贝,而是引用了原容器,导致最终答案都为空
本题收获
- 哈希表用二位数组实现,索引即号码,元素即字母(string二维)
- 一个集合的组合(#77 #216) vs 不同集合的组合(本题)
- 一个集合:用startIndex参数确定下一层for循环搜索的起始位置
- 不同集合:用index参数遍历题目给的字符串,依此切换对应的集合