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

Commit adc6bd5

Browse files
committed
8 medium problems
1 parent 561e190 commit adc6bd5

8 files changed

+293
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
#include <unordered_map>
11+
using std::unordered_map;
12+
13+
class Solution {
14+
public:
15+
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
16+
int n = inorder.size();
17+
int i;
18+
unordered_map<int, int> um;
19+
for (i = 0; i < n; ++i) {
20+
um[inorder[i]] = i;
21+
}
22+
TreeNode *root = reconstruct(inorder, postorder, 0, n - 1, 0, n - 1, um);
23+
um.clear();
24+
return root;
25+
}
26+
private:
27+
TreeNode* reconstruct(vector<int>& in, vector<int>& post, int l1, int r1,
28+
int l2, int r2, unordered_map<int, int>& um) {
29+
if (l1 > r1) {
30+
return NULL;
31+
}
32+
TreeNode *root = new TreeNode(post[r2]);
33+
int root_idx = um[root->val];
34+
int len_left = root_idx - l1;
35+
int len_right = r1 - root_idx;
36+
root->left = reconstruct(in, post, l1, root_idx - 1, l2,
37+
l2 + len_left - 1, um);
38+
root->right = reconstruct(in, post, root_idx + 1, r1, l2 + len_left,
39+
r2 - 1, um);
40+
return root;
41+
}
42+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
#include <unordered_map>
11+
using std::unordered_map;
12+
13+
class Solution {
14+
public:
15+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
16+
int n = inorder.size();
17+
int i;
18+
unordered_map<int, int> um;
19+
for (i = 0; i < n; ++i) {
20+
um[inorder[i]] = i;
21+
}
22+
TreeNode *root = reconstruct(preorder, inorder, 0, n - 1, 0, n - 1, um);
23+
um.clear();
24+
return root;
25+
}
26+
27+
TreeNode *reconstruct(vector<int> &pre, vector<int> &in, int l1, int r1,
28+
int l2, int r2, unordered_map<int, int> &um) {
29+
if (l1 > r1) {
30+
return NULL;
31+
}
32+
TreeNode *root = new TreeNode(pre[l1]);
33+
int root_idx = um[root->val];
34+
int len_left = root_idx - l2;
35+
int len_right = r2 - root_idx;
36+
root->left = reconstruct(pre, in, l1 + 1, l1 + len_left, l2,
37+
root_idx - 1, um);
38+
root->right = reconstruct(pre, in, r1 - len_right + 1, r1,
39+
root_idx + 1, r2, um);
40+
return root;
41+
}
42+
};

max-consecutive-ones_1_AC.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <algorithm>
2+
using std::max;
3+
4+
class Solution {
5+
public:
6+
int findMaxConsecutiveOnes(vector<int>& nums) {
7+
int n = nums.size();
8+
int i, j;
9+
int res = 0;
10+
11+
i = 0;
12+
while (i < n) {
13+
if (nums[i] == 0) {
14+
++i;
15+
continue;
16+
}
17+
j = i + 1;
18+
while (j < n && nums[j] == 1) {
19+
++j;
20+
}
21+
res = max(res, j - i);
22+
i = j;
23+
}
24+
return res;
25+
}
26+
};

palindrome-partitioning_1_AC.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Solution {
2+
public:
3+
vector<vector<string>> partition(string s) {
4+
int ls = s.size();
5+
vector<vector<string>> res;
6+
if (ls == 0) {
7+
return res;
8+
}
9+
10+
vector<vector<bool>> is_pal(ls, vector<bool>(ls, false));
11+
int i, j;
12+
for (i = 0; i < ls; ++i) {
13+
is_pal[i][i] = true;
14+
}
15+
for (i = 0; i < ls - 1; ++i) {
16+
is_pal[i][i + 1] = (s[i] == s[i + 1]);
17+
}
18+
for (i = 2; i < ls; ++i) {
19+
for (j = 0; j + i < ls; ++j) {
20+
is_pal[j][j + i] = (is_pal[j + 1][j + i - 1] &&
21+
(s[j] == s[j + i]));
22+
}
23+
}
24+
vector<string> v;
25+
dfs(0, v, s, res, is_pal);
26+
return res;
27+
}
28+
private:
29+
void dfs(int idx, vector<string> &v, string &s, vector<vector<string>> &res,
30+
vector<vector<bool>> &is_pal) {
31+
int ls = s.size();
32+
if (idx == ls) {
33+
res.push_back(v);
34+
return;
35+
}
36+
int i;
37+
for (i = idx; i < ls; ++i) {
38+
if (!is_pal[idx][i]) {
39+
continue;
40+
}
41+
v.push_back(s.substr(idx, i - idx + 1));
42+
dfs(i + 1, v, s, res, is_pal);
43+
v.pop_back();
44+
}
45+
}
46+
};

permutations-ii_1_AC.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include <algorithm>
2+
using std::reverse;
3+
using std::sort;
4+
using std::swap;
5+
6+
class Solution {
7+
public:
8+
vector<vector<int>> permuteUnique(vector<int>& nums) {
9+
sort(nums.begin(), nums.end());
10+
int n = nums.size();
11+
vector<vector<int>> res;
12+
do {
13+
res.push_back(nums);
14+
} while (nextPermutation(nums, 0, n - 1));
15+
return res;
16+
}
17+
private:
18+
bool nextPermutation(vector<int> &v, int left, int right) {
19+
if (left >= right) {
20+
return false;
21+
}
22+
23+
int i, j;
24+
i = right - 1;
25+
while (i >= left && v[i] >= v[i + 1]) {
26+
--i;
27+
}
28+
if (i < left) {
29+
return false;
30+
}
31+
32+
j = right;
33+
while (v[i] >= v[j]) {
34+
--j;
35+
}
36+
swap(v[i], v[j]);
37+
reverse(v.begin() + i + 1, v.begin() + right + 1);
38+
return true;
39+
}
40+
};

search-for-a-range_1_AC.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <algorithm>
2+
using std::lower_bound;
3+
using std::upper_bound;
4+
5+
class Solution {
6+
public:
7+
vector<int> searchRange(vector<int>& nums, int target) {
8+
vector<int> res(2, -1);
9+
int n = nums.size();
10+
int pos = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
11+
if (pos == n || nums[pos] > target) {
12+
return res;
13+
}
14+
res[0] = pos;
15+
res[1] = upper_bound(nums.begin(), nums.end(), target) - nums.begin() - 1;
16+
return res;
17+
}
18+
};
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8+
* };
9+
*/
10+
class Solution {
11+
public:
12+
vector<TreeNode*> generateTrees(int n) {
13+
vector<TreeNode *> res;
14+
if (n == 0) {
15+
return res;
16+
}
17+
dfs(1, n, res);
18+
return res;
19+
}
20+
private:
21+
void dfs(int left, int right, vector<TreeNode *> &res) {
22+
if (left > right) {
23+
res.push_back(NULL);
24+
return;
25+
}
26+
int i, j, k;
27+
vector<TreeNode *> left_res, right_res;
28+
TreeNode *root;
29+
int nl, nr;
30+
for (i = left; i <= right; ++i) {
31+
dfs(left, i - 1, left_res);
32+
dfs(i + 1, right, right_res);
33+
nl = left_res.size();
34+
nr = right_res.size();
35+
for (j = 0; j < nl; ++j) {
36+
for (k = 0; k < nr; ++k) {
37+
root = new TreeNode(i);
38+
root->left = left_res[j];
39+
root->right = right_res[k];
40+
res.push_back(root);
41+
}
42+
}
43+
left_res.clear();
44+
right_res.clear();
45+
}
46+
}
47+
};

unique-paths-ii_1_AC.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Leetcode has just added integer overflow detection, so watch out.
2+
#include <cstdint>
3+
4+
class Solution {
5+
public:
6+
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
7+
int n = obstacleGrid.size();
8+
int m = (n > 0 ? obstacleGrid[0].size() : 0);
9+
if (n == 0 || m == 0) {
10+
return 0;
11+
}
12+
13+
vector<vector<int64_t>> dp(2, vector<int64_t>(m + 1));
14+
int i, j;
15+
int f, nf;
16+
17+
dp[0][1] = 1;
18+
f = 1;
19+
nf = 1 - f;
20+
for (i = 0; i < n; ++i) {
21+
dp[f][0] = 0;
22+
for (j = 0; j < m; ++j) {
23+
dp[f][j + 1] = (obstacleGrid[i][j] == 0 ? dp[nf][j + 1] + dp[f][j] : 0);
24+
}
25+
f = 1 - f;
26+
nf = 1 - f;
27+
}
28+
int res = dp[nf][m];
29+
dp.clear();
30+
return res;
31+
}
32+
};

0 commit comments

Comments
 (0)