Skip to content

Commit d2ef901

Browse files
Merge remote-tracking branch 'doocs/master'
# Conflicts: # solution/0033.Search in Rotated Sorted Array/Solution.java
2 parents d0eeb0a + cdc96ca commit d2ef901

File tree

9 files changed

+273
-113
lines changed

9 files changed

+273
-113
lines changed

README.md

Lines changed: 80 additions & 80 deletions
Large diffs are not rendered by default.

Rename folder.go

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
private final String[] M = {"", "M", "MM", "MMM"};
3+
private final String[] C = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
4+
private final String[] X = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
5+
private final String[] I = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
6+
public String intToRoman(int num) {
7+
return M[num / 1000] + C[(num % 1000) / 100] + X[(num % 100) / 10] + I[num % 10];
8+
}
9+
}

solution/0015.3Sum/Solution.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
class Solution {
2+
public:
3+
vector<vector<int> > threeSum(vector<int> &num) {
4+
return threeSumGen(num, 0);
5+
}
6+
7+
vector<vector<int> > threeSumGen(vector<int> &num, int target) {
8+
vector<vector<int>> allSol;
9+
if(num.size()<3) return allSol;
10+
sort(num.begin(),num.end());
11+
12+
for(int i=0; i<num.size()-2; i++) {
13+
if(i>0 && num[i]==num[i-1]) continue; // 去重
14+
15+
int left=i+1, right=num.size()-1;
16+
17+
while(left<right) {
18+
int curSum = num[left]+num[right];
19+
int curTarget = target-num[i];
20+
if(curSum==curTarget) {
21+
vector<int> sol;
22+
sol.push_back(num[i]);
23+
sol.push_back(num[left]);
24+
sol.push_back(num[right]);
25+
allSol.push_back(sol);
26+
left++;
27+
right--;
28+
while(num[left]==num[left-1]) left++;
29+
while(num[right]==num[right+1]) right--;
30+
}
31+
else if(curSum<curTarget)
32+
left++;
33+
else
34+
right--;
35+
}
36+
}
37+
return allSol;
38+
}
39+
40+
41+
42+
//backtrace TLE
43+
44+
// vector<vector<int>> threeSum(vector<int>& nums) {
45+
// sort(nums.begin(), nums.end());
46+
// if (nums.size() <= 2 || nums[0] > 0) return{};
47+
// set<vector<int>> res;
48+
// for (int i = 0; i < nums.size(); i++)
49+
// {
50+
// int target = 0 - nums[i];
51+
// int m = 0, n = nums.size() - 1;
52+
// while (m < n)
53+
// {
54+
// while (true)
55+
// {
56+
// if (m >= n) break;
57+
// if (m == i)
58+
// {
59+
// m++;
60+
// continue;
61+
// }
62+
// if (n == i)
63+
// {
64+
// n--;
65+
// continue;
66+
// }
67+
// if (nums[m] + nums[n] == target) {
68+
// vector<int> s = { nums[m++], nums[i], nums[n] };
69+
// sort(s.begin(), s.end());
70+
// res.insert(s);
71+
// break;
72+
// }
73+
// if (nums[m] + nums[n] > target) n--;
74+
// if (nums[m] + nums[n] < target) m++;
75+
// }
76+
// }
77+
78+
// }
79+
// vector<vector<int>> fres(res.begin(), res.end());
80+
// return fres;
81+
// }
82+
};
83+
84+
// accelerate the cin process.
85+
int x = []() {
86+
std::ios::sync_with_stdio(false);
87+
cin.tie(NULL);
88+
return 0;
89+
}();
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
## 从前序与中序遍历序列构造二叉树
2+
3+
### 问题描述
4+
根据一棵树的前序遍历与中序遍历构造二叉树。
5+
6+
注意:
7+
你可以假设树中没有重复的元素。
8+
9+
例如,给出
10+
```
11+
前序遍历 preorder = [3,9,20,15,7]
12+
中序遍历 inorder = [9,3,15,20,7]
13+
```
14+
15+
返回如下的二叉树:
16+
```
17+
3
18+
/ \
19+
9 20
20+
/ \
21+
15 7
22+
```
23+
---------------
24+
25+
### 思路
26+
27+
利用树的前序遍历和中序遍历特性+递归实现
28+
29+
对树进行前序遍历,每一个元素,在树的中序遍历中找到概元素;在中序遍历中,该元素的左边是它的左子树的全部元素,右边是它的右子树的全部元素,以此为递归条件,确定左右子树的范围
30+
31+
```CPP
32+
/**
33+
* Definition for a binary tree node.
34+
* struct TreeNode {
35+
* int val;
36+
* TreeNode *left;
37+
* TreeNode *right;
38+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
39+
* };
40+
*/
41+
class Solution {
42+
public:
43+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
44+
int pRight = preorder.size()-1;
45+
int iRight = inorder.size()-1;
46+
return build(preorder,inorder,0,pRight,0,iRight);
47+
}
48+
49+
50+
TreeNode* build(vector<int>& preorder,vector<int>& inorder,int pLeft,int pRight,int iLeft,int iRight){
51+
if(pLeft > pRight)return NULL;
52+
53+
TreeNode *node = new TreeNode(preorder[pLeft]);
54+
int idx = iLeft;
55+
56+
while(inorder[idx] != preorder[pLeft])idx++;
57+
node->left = build(preorder,inorder,pLeft+1,pLeft+idx-iLeft,iLeft,idx-1);
58+
node->right = build(preorder,inorder,pLeft+idx-iLeft+1,pRight,idx+1,iRight);
59+
return node;
60+
}
61+
};
62+
63+
```
64+
65+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
13+
int pRight = preorder.size()-1;
14+
int iRight = inorder.size()-1;
15+
return build(preorder,inorder,0,pRight,0,iRight);
16+
}
17+
18+
19+
TreeNode* build(vector<int>& preorder,vector<int>& inorder,int pLeft,int pRight,int iLeft,int iRight){
20+
if(pLeft > pRight)return NULL;
21+
22+
TreeNode *node = new TreeNode(preorder[pLeft]);
23+
int idx = iLeft;
24+
25+
while(inorder[idx] != preorder[pLeft])idx++;
26+
node->left = build(preorder,inorder,pLeft+1,pLeft+idx-iLeft,iLeft,idx-1);
27+
node->right = build(preorder,inorder,pLeft+idx-iLeft+1,pRight,idx+1,iRight);
28+
return node;
29+
}
30+
};

0 commit comments

Comments
 (0)