Skip to content

Commit 2554d3f

Browse files
committed
Finish 132 / 132
1 parent c946bb1 commit 2554d3f

File tree

76 files changed

+2424
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+2424
-1
lines changed

3_SUM.cc

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public:
3+
void add(vector<vector<int> > &ret, int a, int b, int c) {
4+
vector<int> tmp;
5+
tmp.push_back(a);
6+
tmp.push_back(b);
7+
tmp.push_back(c);
8+
ret.push_back(tmp);
9+
}
10+
vector<vector<int> > threeSum(vector<int> &num) {
11+
// Start typing your C/C++ solution below
12+
// DO NOT write int main() function
13+
vector<vector<int> > ans;
14+
if (num.size() < 3) {
15+
return ans;
16+
}
17+
sort(num.begin(), num.end());
18+
int left, right;
19+
for (int i = 0; i < num.size() - 2; i++) {
20+
if (i > 0 && num[i] == num[i - 1]) {
21+
continue;
22+
}
23+
left = i + 1;
24+
right = num.size() - 1;
25+
while (left < right) {
26+
if (left > i + 1 && num[left] == num[left - 1]) {
27+
left++;
28+
continue;
29+
}
30+
if (right < num.size() - 1 && num[right] == num[right + 1]) {
31+
right--;
32+
continue;
33+
}
34+
if (num[left] + num[right] == 0 - num[i]) {
35+
add(ans, num[i], num[left], num[right]);
36+
left++;
37+
} else if (num[left] + num[right] > 0 - num[i]) {
38+
right--;
39+
} else {
40+
left++;
41+
}
42+
}
43+
}
44+
return ans;
45+
}
46+
};

3_Sum_Closest.cc

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
public:
3+
int abs(int x, int y) {
4+
if (x >= y) {
5+
return x - y;
6+
} else {
7+
return y - x;
8+
}
9+
}
10+
int threeSumClosest(vector<int> &num, int target) {
11+
// Start typing your C/C++ solution below
12+
// DO NOT write int main() function
13+
if (num.size() < 3) {
14+
return 0;
15+
}
16+
sort(num.begin(), num.end());
17+
int ret = num[0] + num[1] + num[2];
18+
int left, right, tmp;
19+
for (int i = 0; i < num.size() - 2; i++) {
20+
left = i + 1;
21+
right = num.size() - 1;
22+
while (left < right) {
23+
tmp = num[i] + num[left] + num[right];
24+
if (abs(target, tmp) < abs(target, ret)) {
25+
ret = tmp;
26+
if (ret == target) {
27+
return ret;
28+
}
29+
}
30+
if (tmp < target) {
31+
left++;
32+
} else {
33+
right--;
34+
}
35+
}
36+
}
37+
return ret;
38+
}
39+
};

4_Sum.cc

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
class Solution {
2+
public:
3+
void add(vector<vector<int> > &ret, int a, int b, int c, int d) {
4+
vector<int> tmp;
5+
tmp.push_back(a);
6+
tmp.push_back(b);
7+
tmp.push_back(c);
8+
tmp.push_back(d);
9+
ret.push_back(tmp);
10+
}
11+
vector<vector<int> > fourSum(vector<int> &num, int target) {
12+
// Start typing your C/C++ solution below
13+
// DO NOT write int main() function
14+
vector<vector<int> > ret;
15+
if (num.size() < 4) {
16+
return ret;
17+
}
18+
sort(num.begin(), num.end());
19+
int left, right;
20+
for (int i = 0; i < num.size() - 3; i++) {
21+
if (i > 0 && num[i] == num[i - 1]) {
22+
continue;
23+
}
24+
for (int j = i + 1; j < num.size() - 2; j++) {
25+
if (j != i + 1 && num[j] == num[j - 1]) {
26+
continue;
27+
}
28+
left = j + 1;
29+
right = num.size() - 1;
30+
while (left < right) {
31+
if (left != j + 1 && num[left] == num[left - 1]) {
32+
left++;
33+
continue;
34+
}
35+
if (right != num.size() - 1 && num[right] == num[right + 1]) {
36+
right--;
37+
continue;
38+
}
39+
int tmp = num[i] + num[j] + num[left] + num[right];
40+
if (tmp == target) {
41+
add(ret, num[i], num[j], num[left], num[right]);
42+
left++;
43+
} else if (tmp < target) {
44+
left++;
45+
} else {
46+
right--;
47+
}
48+
}
49+
}
50+
}
51+
return ret;
52+
}
53+
};

Add_Binary.cc

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class Solution {
2+
public:
3+
string addBinary(string a, string b) {
4+
// Start typing your C/C++ solution below
5+
// DO NOT write int main() function
6+
string ans = "";
7+
int pa = a.length() - 1;
8+
int pb = b.length() - 1;
9+
int nxt = 0, cur;
10+
while (pa >= 0 && pb >= 0) {
11+
cur = a[pa] + b[pb] + nxt - '0' - '0';
12+
if (cur >= 2) {
13+
cur -= 2;
14+
nxt = 1;
15+
} else {
16+
nxt = 0;
17+
}
18+
ans = char(cur + '0') + ans;
19+
pa--, pb--;
20+
}
21+
while (pa >= 0) {
22+
cur = a[pa] + nxt - '0';
23+
if (cur >= 2) {
24+
cur -= 2;
25+
nxt = 1;
26+
} else {
27+
nxt = 0;
28+
}
29+
ans = char(cur + '0') + ans;
30+
pa--;
31+
}
32+
while (pb >= 0) {
33+
cur = b[pb] + nxt - '0';
34+
if (cur >= 2) {
35+
cur -= 2;
36+
nxt = 1;
37+
} else {
38+
nxt = 0;
39+
}
40+
ans = char(cur + '0') + ans;
41+
pb--;
42+
}
43+
if (nxt) {
44+
ans = '1' + ans;
45+
}
46+
return ans;
47+
}
48+
};

Add_Two_Numbers.cc

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode(int x) : val(x), next(NULL) {}
7+
* };
8+
*/
9+
class Solution {
10+
public:
11+
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
12+
// Start typing your C/C++ solution below
13+
// DO NOT write int main() function
14+
ListNode *ret = NULL;
15+
ListNode **pCur = &ret;
16+
int nxt = 0;
17+
while (l1 && l2) {
18+
*pCur = new ListNode((l1->val + l2->val + nxt) % 10);
19+
nxt = (l1->val + l2->val + nxt) / 10;
20+
pCur = &((*pCur)->next);
21+
l1 = l1->next;
22+
l2 = l2->next;
23+
}
24+
while (l1 != NULL) {
25+
*pCur = new ListNode((l1->val + nxt) % 10);
26+
nxt = (l1->val + nxt) / 10;
27+
pCur = &((*pCur)->next);
28+
l1 = l1->next;
29+
}
30+
while (l2 != NULL) {
31+
*pCur = new ListNode((l2->val + nxt) % 10);
32+
nxt = (l2->val + nxt) / 10;
33+
pCur = &((*pCur)->next);
34+
l2 = l2->next;
35+
}
36+
if (nxt > 0) {
37+
*pCur = new ListNode(nxt);
38+
}
39+
return ret;
40+
}
41+
};

Anagrams.cc

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
vector<string> anagrams(vector<string> &strs) {
4+
// Start typing your C/C++ solution below
5+
// DO NOT write int main() function
6+
map<string, vector<string> > mp;
7+
vector<string> ans;
8+
string tmp;
9+
for (int i = 0; i < strs.size(); i++) {
10+
tmp = strs[i];
11+
sort(tmp.begin(), tmp.end());
12+
mp[tmp].push_back(strs[i]);
13+
}
14+
for (map<string, vector<string> >::iterator p = mp.begin(); p != mp.end(); p++) {
15+
if ((p->second).size() > 1) {
16+
for (int i = 0; i < (p->second).size(); i++) {
17+
ans.push_back((p->second)[i]);
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
};

Climbing_Stairs.cc

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class Solution {
2+
public:
3+
int climbStairs(int n) {
4+
// Start typing your C/C++ solution below
5+
// DO NOT write int main() function
6+
if (n < 2) {
7+
return 1;
8+
}
9+
Mat ans;
10+
ans.a[0][0] = ans.a[1][0] = ans.a[0][1] = 1;
11+
ans = Power(ans, n);
12+
return ans.a[0][0];
13+
}
14+
private:
15+
struct Mat {
16+
int a[2][2];
17+
Mat() {
18+
memset(a, 0, sizeof(a));
19+
}
20+
};
21+
Mat Mul(Mat &A, Mat &B) {
22+
Mat ret;
23+
for (int k = 0; k < 2; k++) {
24+
for (int i = 0; i < 2; i++) {
25+
if (A.a[i][k] == 0) {
26+
continue;
27+
}
28+
for (int j = 0; j < 2; j++) {
29+
if (B.a[k][j] == 0) {
30+
continue;
31+
}
32+
ret.a[i][j] += A.a[i][k] * B.a[k][j];
33+
}
34+
}
35+
}
36+
return ret;
37+
}
38+
Mat Power(Mat A, int k) {
39+
Mat ret;
40+
ret.a[0][0] = ret.a[1][1] = 1;
41+
while (k) {
42+
if (k & 1) {
43+
ret = Mul(ret, A);
44+
}
45+
k >>= 1;
46+
A = Mul(A, A);
47+
}
48+
return ret;
49+
}
50+
};

Combination_Sum.cc

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
void dfs(vector<vector<int> > &ret, vector<int> &tmp, vector<int> &candidates, int pos, int curSum, int target) {
4+
if (pos == candidates.size()) {
5+
if (curSum == target) {
6+
ret.push_back(tmp);
7+
}
8+
return;
9+
}
10+
dfs(ret, tmp, candidates, pos + 1, curSum, target);
11+
if (candidates[pos] + curSum <= target) {
12+
tmp.push_back(candidates[pos]);
13+
dfs(ret, tmp, candidates, pos, curSum + candidates[pos], target);
14+
tmp.pop_back();
15+
}
16+
}
17+
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
18+
// Start typing your C/C++ solution below
19+
// DO NOT write int main() function
20+
vector<vector<int> > ret;
21+
vector<int> tmp;
22+
sort(candidates.begin(), candidates.end());
23+
dfs(ret, tmp, candidates, 0, 0, target);
24+
return ret;
25+
}
26+
};

Combination_Sum_II.cc

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
void dfs(vector<vector<int> > &ret, vector<int> &tmp, vector<int> &num, int pos, int curSum, int target) {
4+
if (pos == num.size()) {
5+
if (curSum == target) {
6+
ret.push_back(tmp);
7+
}
8+
return;
9+
}
10+
dfs(ret, tmp, num, pos + 1, curSum, target);
11+
if (curSum + num[pos] <= target) {
12+
if (pos > 0 && num[pos] == num[pos - 1] && vis[pos - 1] == false) {
13+
return;
14+
}
15+
tmp.push_back(num[pos]);
16+
vis[pos] = true;
17+
dfs(ret, tmp, num, pos + 1, curSum + num[pos], target);
18+
vis[pos] = false;
19+
tmp.pop_back();
20+
}
21+
}
22+
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
23+
// Start typing your C/C++ solution below
24+
// DO NOT write int main() function
25+
vector<vector<int> > ret;
26+
vector<int> tmp;
27+
if (num.size() == 0) {
28+
return ret;
29+
}
30+
vis = new bool[num.size()];
31+
memset(vis, false, sizeof(vis));
32+
sort(num.begin(), num.end());
33+
dfs(ret, tmp, num, 0, 0, target);
34+
return ret;
35+
}
36+
private:
37+
bool *vis;
38+
};

0 commit comments

Comments
 (0)