Skip to content
This repository was archived by the owner on May 16, 2021. It is now read-only.

Commit 8c20a8a

Browse files
committed
add 10 problems
1 parent 8e423e1 commit 8c20a8a

11 files changed

+547
-0
lines changed

2-keys-keyboard_1_AC.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Trivial
2+
#include <vector>
3+
using std::vector;
4+
5+
class Solution {
6+
public:
7+
int minSteps(int n) {
8+
vector<int> dp(n + 1, 0);
9+
int i;
10+
for (i = 2; i <= n; ++i) {
11+
dp[i] = i;
12+
}
13+
14+
int j;
15+
for (i = 2; i <= n; ++i) {
16+
for (j = 1; j <= n / j; ++j) {
17+
if (i % j != 0) {
18+
continue;
19+
}
20+
if (dp[i] > dp[j] + i / j) {
21+
dp[i] = dp[j] + i / j;
22+
}
23+
if (j != i / j && dp[i] > dp[i / j] + j) {
24+
dp[i] = dp[i / j] + j;
25+
}
26+
}
27+
}
28+
29+
int res = dp[n];
30+
return res;
31+
}
32+
};

dota2-senate_1_AC.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// Just greedy, no game theory involved.
2+
// Although the problem itself is not exactly easy, could be a bit tricky.
3+
class Solution {
4+
public:
5+
string predictPartyVictory(string senate) {
6+
auto &s = senate;
7+
int ls = s.size();
8+
9+
int nr, nd;
10+
nr = nd = 0;
11+
int i;
12+
for (i = 0; i < ls; ++i) {
13+
if (senate[i] == 'R') {
14+
++nr;
15+
} else {
16+
++nd;
17+
}
18+
}
19+
if (nd == 0) {
20+
return "Radiant";
21+
} else if (nr == 0) {
22+
return "Dire";
23+
}
24+
25+
int ir = nextPos(s, 'R', 0);
26+
int id = nextPos(s, 'D', 0);
27+
int cr = nr;
28+
int cd = nd;
29+
for (i = 0; i < ls; ++i) {
30+
if (nr == 0 || nd == 0) {
31+
break;
32+
}
33+
if (s[i] == 'R') {
34+
// choose the next 'D' to ban
35+
if (id < i && cd > 0) {
36+
id = nextPos(s, 'D', i + 1);
37+
}
38+
s[id] = 'X';
39+
--nd;
40+
--cd;
41+
id = nextPos(s, 'D', id + 1);
42+
43+
--cr;
44+
} else if (s[i] == 'D') {
45+
// choose the next 'R' to ban
46+
if (ir < i && cr > 0) {
47+
ir = nextPos(s, 'R', i + 1);
48+
}
49+
s[ir] = 'X';
50+
--nr;
51+
--cr;
52+
ir = nextPos(s, 'R', ir + 1);
53+
54+
--cd;
55+
} else {
56+
// already banned
57+
}
58+
}
59+
if (nd == 0) {
60+
return "Radiant";
61+
} else if (nr == 0) {
62+
return "Dire";
63+
}
64+
65+
string s1;
66+
for (i = 0; i < ls; ++i) {
67+
if (s[i] == 'R' || s[i] == 'D') {
68+
s1.push_back(s[i]);
69+
}
70+
}
71+
return predictPartyVictory(s1);
72+
}
73+
private:
74+
int nextPos(const string &s, char c, int idx) {
75+
int ls = s.size();
76+
int i = idx;
77+
while (i < ls && s[i] != c) {
78+
++i;
79+
}
80+
if (i < ls && s[i] == c) {
81+
return i;
82+
}
83+
84+
i = 0;
85+
while (i < idx && s[i] != c) {
86+
++i;
87+
}
88+
return i;
89+
}
90+
};

find-duplicate-subtrees_1_AC.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// When it comes to pattern matching in structured data, you need serialization.
2+
/**
3+
* Definition for a binary tree node.
4+
* struct TreeNode {
5+
* int val;
6+
* TreeNode *left;
7+
* TreeNode *right;
8+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
9+
* };
10+
*/
11+
#include <string>
12+
#include <unordered_map>
13+
#include <vector>
14+
using std::string;
15+
using std::to_string;
16+
using std::unordered_map;
17+
using std::vector;
18+
19+
class Solution {
20+
public:
21+
vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
22+
vector<TreeNode *> res;
23+
if (root == NULL) {
24+
return res;
25+
}
26+
27+
serialize(root);
28+
for (auto &p: um) {
29+
if (p.second.size() > 1) {
30+
res.push_back(p.second[0]);
31+
}
32+
}
33+
um.clear();
34+
35+
return res;
36+
}
37+
private:
38+
unordered_map<string, vector<TreeNode *>> um;
39+
40+
string serialize(TreeNode *root) {
41+
if (root == NULL) {
42+
return "null";
43+
}
44+
string sl = serialize(root->left);
45+
string sr = serialize(root->right);
46+
string s = "{" + to_string(root->val) + "," + sl + "," + sr + "}";
47+
um[s].push_back(root);
48+
49+
return s;
50+
}
51+
};

maximum-binary-tree_1_AC.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Brute-force
2+
/**
3+
* Definition for a binary tree node.
4+
* struct TreeNode {
5+
* int val;
6+
* TreeNode *left;
7+
* TreeNode *right;
8+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
9+
* };
10+
*/
11+
#include <vector>
12+
using std::vector;
13+
14+
class Solution {
15+
public:
16+
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
17+
int n = nums.size();
18+
TreeNode *root;
19+
20+
traverse(root, nums, 0, n - 1);
21+
return root;
22+
}
23+
private:
24+
void traverse(TreeNode *&root, vector<int> &v, int ll, int rr) {
25+
if (ll > rr) {
26+
root = NULL;
27+
return;
28+
}
29+
int mm = ll;
30+
int i;
31+
for (i = ll + 1; i <= rr; ++i) {
32+
if (v[i] > v[mm]) {
33+
mm = i;
34+
}
35+
}
36+
root = new TreeNode(v[mm]);
37+
traverse(root->left, v, ll, mm - 1);
38+
traverse(root->right, v, mm + 1, rr);
39+
}
40+
};

maximum-binary-tree_2_AC.cpp

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// RMQ problem, very intuitive and efficient, but be careful with the coding.
2+
/**
3+
* Definition for a binary tree node.
4+
* struct TreeNode {
5+
* int val;
6+
* TreeNode *left;
7+
* TreeNode *right;
8+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
9+
* };
10+
*/
11+
#include <cmath>
12+
#include <vector>
13+
using std::log;
14+
using std::vector;
15+
16+
class Solution {
17+
public:
18+
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
19+
auto &v = nums;
20+
int n = v.size();
21+
int dep = (int)(log(n) / log(2.0)) + 1;
22+
23+
int i;
24+
max_idx.resize(dep, vector<int>(n));
25+
for (i = 0; i < n; ++i) {
26+
max_idx[0][i] = i;
27+
}
28+
29+
int j;
30+
int b2 = 1;
31+
int i1, i2;
32+
for (i = 1; i < dep; ++i) {
33+
for (j = 0; j < n; ++j) {
34+
i1 = max_idx[i - 1][j];
35+
if (j + b2 < n) {
36+
i2 = max_idx[i - 1][j + b2];
37+
max_idx[i][j] = (v[i1] > v[i2]) ? i1 : i2;
38+
} else {
39+
max_idx[i][j] = i1;
40+
}
41+
}
42+
b2 <<= 1;
43+
}
44+
45+
TreeNode *root;
46+
traverse(root, nums, 0, n);
47+
max_idx.clear();
48+
49+
return root;
50+
}
51+
private:
52+
vector<vector<int>> max_idx;
53+
54+
int rmq(vector<int> &v, int ll, int rr) {
55+
int d = 0;
56+
int b2 = 1;
57+
int lr, rl;
58+
while (true) {
59+
lr = ll + b2;
60+
rl = rr - b2;
61+
if (lr >= rl) {
62+
// two intervals overlap
63+
break;
64+
} else {
65+
// double the interval length
66+
d += 1;
67+
b2 <<= 1;
68+
}
69+
}
70+
int i1 = max_idx[d][ll];
71+
int i2 = max_idx[d][rl];
72+
return (v[i1] > v[i2]) ? i1 : i2;
73+
}
74+
75+
void traverse(TreeNode *&root, vector<int> &v, int ll, int rr) {
76+
if (ll >= rr) {
77+
root = NULL;
78+
return;
79+
}
80+
int mm = rmq(v, ll, rr);
81+
root = new TreeNode(v[mm]);
82+
traverse(root->left, v, ll, mm);
83+
traverse(root->right, v, mm + 1, rr);
84+
}
85+
};

maximum-length-of-pair-chain_1_AC.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Think for a while before coding.
2+
#include <algorithm>
3+
#include <vector>
4+
using std::sort;
5+
using std::vector;
6+
7+
typedef vector<int> VI;
8+
9+
bool comparator(const VI &v1, const VI &v2)
10+
{
11+
if (v1[1] != v2[1]) {
12+
return v1[1] < v2[1];
13+
}
14+
return false;
15+
}
16+
17+
class Solution {
18+
public:
19+
int findLongestChain(vector<VI> &pairs) {
20+
auto &v = pairs;
21+
int n = v.size();
22+
int i;
23+
24+
sort(v.begin(), v.end(), comparator);
25+
int max_val = v[0][1];
26+
int max_len = 1;
27+
for (i = 1; i < n; ++i) {
28+
// the key
29+
if (v[i][0] > max_val) {
30+
max_val = v[i][1];
31+
++max_len;
32+
}
33+
}
34+
return max_len;
35+
}
36+
};

palindromic-substrings_1_AC.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Brute-force, I don't wanna bother those fancy tricks.
2+
#include <string>
3+
using std::string;
4+
5+
class Solution {
6+
public:
7+
int countSubstrings(string s) {
8+
int ls = s.size();
9+
int i, j;
10+
int sum = 0;
11+
for (i = 0; i < ls; ++i) {
12+
j = 1;
13+
while (i - j >= 0 && i + j <= ls - 1 && s[i - j] == s[i + j]) {
14+
++j;
15+
}
16+
sum += j;
17+
}
18+
for (i = 0; i + 1 < ls; ++i) {
19+
j = 0;
20+
while (i - j >= 0 && i + 1 + j <= ls - 1 && s[i - j] == s[i + 1 + j]) {
21+
++j;
22+
}
23+
sum += j;
24+
}
25+
return sum;
26+
}
27+
};

0 commit comments

Comments
 (0)