Skip to content

Commit d0f6824

Browse files
committed
Add Solution 040&041[CPP]
1 parent 78ffc0a commit d0f6824

File tree

4 files changed

+167
-0
lines changed

4 files changed

+167
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
## 组合总和2
2+
3+
### 题目描述
4+
5+
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
6+
7+
candidates 中的每个数字在每个组合中只能使用一次。
8+
9+
说明:
10+
11+
所有数字(包括目标数)都是正整数。
12+
解集不能包含重复的组合。
13+
14+
```
15+
示例 1:
16+
输入: candidates = [10,1,2,7,6,1,5], target = 8,
17+
所求解集为:
18+
[
19+
[1, 7],
20+
[1, 2, 5],
21+
[2, 6],
22+
[1, 1, 6]
23+
]
24+
25+
示例 2:
26+
输入: candidates = [2,5,2,1,2], target = 5,
27+
所求解集为:
28+
[
29+
[1,2,2],
30+
[5]
31+
]
32+
```
33+
34+
### 思路
35+
36+
和39题一模一样,注意他有重复数,需要去除重复的结果.
37+
38+
还要注意回溯是往后回溯,不是原地回溯了
39+
40+
```CPP
41+
class Solution {
42+
public:
43+
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
44+
vector<vector<int>> ans;
45+
vector<int> tmp;
46+
sort(candidates.begin(),candidates.end());
47+
int len = candidates.size();
48+
49+
dfs(ans,tmp,candidates,target,len,0);
50+
51+
return ans;
52+
}
53+
54+
void dfs(vector<vector<int>> &ans,vector<int> &tmp,vector<int> &nums,int target,int len,int index) {
55+
56+
if(target == 0){
57+
auto iter = find(ans.begin(),ans.end(),tmp);
58+
if(iter == ans.end())ans.push_back(tmp);
59+
}
60+
61+
for(int i = index;i<len && target >= nums[i];i++){
62+
tmp.push_back(nums[i]);
63+
dfs(ans,tmp,nums,target - nums[i],len,i+1);//注意i+1
64+
tmp.pop_back();
65+
}
66+
}
67+
};
68+
```
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
4+
vector<vector<int>> ans;
5+
vector<int> tmp;
6+
sort(candidates.begin(),candidates.end());
7+
int len = candidates.size();
8+
9+
dfs(ans,tmp,candidates,target,len,0);
10+
11+
return ans;
12+
}
13+
14+
void dfs(vector<vector<int>> &ans,vector<int> &tmp,vector<int> &nums,int target,int len,int index) {
15+
16+
if(target == 0){
17+
auto iter = find(ans.begin(),ans.end(),tmp);
18+
if(iter == ans.end())ans.push_back(tmp);
19+
}
20+
21+
for(int i = index;i<len && target >= nums[i];i++){
22+
tmp.push_back(nums[i]);
23+
dfs(ans,tmp,nums,target - nums[i],len,i+1);//注意i+1
24+
tmp.pop_back();
25+
}
26+
}
27+
};
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
## 缺失的第一个正数
2+
3+
### 问题描述
4+
5+
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
6+
7+
```
8+
示例 1:
9+
输入: [1,2,0]
10+
输出: 3
11+
12+
示例 2:
13+
输入: [3,4,-1,1]
14+
输出: 2
15+
16+
示例 3:
17+
输入: [7,8,9,11,12]
18+
输出: 1
19+
```
20+
说明:
21+
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
22+
23+
### 思路
24+
25+
题目的描述一看有点不好理解,其实是把它们排序后,[-1,1,2,4,4,5,6]这里面缺的第一个正整数是3,0不算正整数
26+
27+
1. 对数组排序
28+
2. 过滤小于等于0的部分
29+
3. 从1开始比较,注意过滤重复的元素
30+
31+
```CPP
32+
class Solution {
33+
public:
34+
int firstMissingPositive(vector<int>& nums) {
35+
sort(nums.begin(),nums.end());
36+
int len = nums.size();
37+
if(len == 0)return 1;
38+
int i = 0;
39+
while(nums[i] <= 0 && i < len)i++;
40+
if(i == len)return 1;
41+
42+
int tmp = 1;
43+
while(i<len){
44+
if(nums[i] != tmp)return tmp;
45+
while(len>i+1 && nums[i] == nums[i+1])i++;//去重
46+
i++;
47+
tmp++;
48+
}
49+
return tmp;
50+
}
51+
};
52+
```
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int firstMissingPositive(vector<int>& nums) {
4+
sort(nums.begin(),nums.end());
5+
int len = nums.size();
6+
if(len == 0)return 1;
7+
int i = 0;
8+
while(nums[i] <= 0 && i < len)i++;
9+
if(i == len)return 1;
10+
11+
int tmp = 1;
12+
while(i<len){
13+
if(nums[i] != tmp)return tmp;
14+
while(len>i+1 && nums[i] == nums[i+1])i++;//去重
15+
i++;
16+
tmp++;
17+
}
18+
return tmp;
19+
}
20+
};

0 commit comments

Comments
 (0)