Skip to content

Commit 20e922f

Browse files
Add files via upload
1 parent 0d61dfe commit 20e922f

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// 典型的回溯法
2+
// 下面的这种暴力写法直接超时了
3+
4+
class Solution
5+
{
6+
public:
7+
int combinationSum4(vector<int>& nums, int target)
8+
{
9+
int res = 0;
10+
int curSum = 0;
11+
12+
genSequence(nums, target, curSum, res);
13+
return res;
14+
}
15+
private:
16+
void genSequence(const vector<int>& nums, const int& target, int& curSum, int& res)
17+
{
18+
if (curSum >= target)
19+
{
20+
if (curSum == target)
21+
++res;
22+
return ;
23+
}
24+
25+
for (int i = 0; i < nums.size(); ++i)
26+
{
27+
curSum += nums[i];
28+
genSequence(nums, target, curSum, res);
29+
curSum -= nums[i];
30+
}
31+
}
32+
};
33+
34+
// 转换为自底向上的动态规划来处理
35+
// Runtime: 4 ms, faster than 67.65% of C++ online submissions for Combination Sum IV.
36+
// Memory Usage: 8.6 MB, less than 96.67% of C++ online submissions for Combination Sum IV.
37+
class Solution
38+
{
39+
public:
40+
int combinationSum4(vector<int>& nums, int target)
41+
{
42+
// 这里如果使用int就会溢出,long同样会溢出,换成无符号就没问题,这好奇怪呀
43+
// 这里应该是确实结果太大的情况,答案就自动求余数了
44+
vector<unsigned int> memo(target + 1, 0);
45+
memo[0] = 1;
46+
for (int i = 1; i <= target; ++i)
47+
{
48+
for (auto item : nums)
49+
{
50+
if (i - item >= 0)
51+
memo[i] += memo[i - item];
52+
}
53+
}
54+
55+
return memo[target];
56+
}
57+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// 第一种思路是使用哈希表,每产生一个序列就插入到哈希表中
2+
// Runtime: 60 ms, faster than 35.43% of C++ online submissions for Letter Tile Possibilities.
3+
// Memory Usage: 17.3 MB, less than 100.00% of C++ online submissions for Letter Tile Possibilities.
4+
5+
typedef unordered_set<string> hashSet;
6+
7+
class Solution
8+
{
9+
public:
10+
int numTilePossibilities(string tiles)
11+
{
12+
unordered_set<string> hashset;
13+
vector<bool> visited(tiles.length(), false);
14+
string str = "";
15+
16+
genSequence(tiles, visited, hashset, str);
17+
return hashset.size();
18+
}
19+
private:
20+
void genSequence(const string& input, vector<bool>& visited, hashSet& hashset, string& str)
21+
{
22+
for (int i = 0; i < input.length(); ++i)
23+
{
24+
if (visited[i] == false)
25+
{
26+
str += input[i];
27+
visited[i] = true;
28+
29+
if (hashset.find(str) == hashset.end())
30+
hashset.insert(str);
31+
32+
genSequence(input, visited, hashset, str);
33+
34+
str.pop_back();
35+
visited[i] = false;
36+
}
37+
}
38+
}
39+
};

0 commit comments

Comments
 (0)