dfs以及搜索问题
DFS是搜索的手段之一。它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态。直到找到最终的解。
全排列
1 | 给定一个没有重复数字的序列,返回其所有可能的全排列。 |
题解:
C++可以用库
1 | class Solution { |
另一种全排列的方法,回溯的思想
思路来源于网友们。
1 | class Solution { |
带剪枝的全排列
1 | 给定一个可包含重复数字的序列,返回所有不重复的全排列。 |
题解:
1、使用了STL 的count函数来剪枝,然后时间复杂度惊人。
执行用时 :2280 ms, 在所有 C++ 提交中击败了5.03%的用户
内存消耗 :10 MB, 在所有 C++ 提交中击败了65.48%的用户
1 | class Solution { |
2、使用C++自带全排列
1 | 可以使用next_permutation,前提是先从小到大排序,该函数输出的就是无重复的全排列,运行时间24ms,击败98.87%。 |
3、参考了评论区大佬
用map进行改进
执行用时 :8 ms, 在所有 C++ 提交中击败了95.62%的用户
内存消耗 :11.1 MB, 在所有 C++ 提交中击败了25.72%的用户
1 | class Solution { |
子集
题目
1 | 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 |
题解
这个问题类似于下面的目标和、部分和问题。
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :13.1 MB, 在所有 C++ 提交中击败了7.49%的用户
1 | class Solution { |
部分和&&目标和问题
部分和问题
这一段来自《挑战程序设计语言(第二版)》
给定整数a1、a2、…….an,判断是否可以从中选出若干数,使它们的和恰好为K。
.png)
样例输入:
1 | n=4 |
样例输出
1 | Yes {13=2+4+7} |
样例输入:
1 | n=4 |
样例输出
1 | No |
题解思路:从$a_1$开始按顺序决定每个数加或者不加,在全部n个数后判断它们的和是不是k即可。
状态数是$2^{n+1}$所以复杂度是O($2^n$)
1 | int a[MAX_N]; |
目标和问题[动态规划等解法待补充]
类似问题
1 | 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 |
这是一种类似暴力的解法
执行用时 :1776 ms, 在所有 C++ 提交中击败了8.70%的用户
内存消耗 :8.8 MB, 在所有 C++ 提交中击败了29.83%的用户
1 | class Solution { |