Skip to content

Commit 5901a83

Browse files
committed
Update solutions.
1 parent 87310d9 commit 5901a83

17 files changed

+248
-404
lines changed

BinaryTreeLevelOrderTraversal.h

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,35 +42,30 @@ class Solution {
4242
return levelOrder_1(root);
4343
}
4444

45-
vector<vector<int>> levelOrder_1(TreeNode *root) {
46-
vector<vector<int>> res;
45+
vector<vector<int> > levelOrder_1(TreeNode *root) {
46+
vector<vector<int> > res;
4747
if (!root) return res;
48-
4948
queue<TreeNode *> q;
5049
q.push(root);
51-
q.push(NULL); // end indicator of one level
50+
q.push(NULL);
5251
vector<int> level;
53-
while (q.size() > 0)
52+
while (true)
5453
{
55-
TreeNode *front = q.front();
56-
q.pop();
57-
if (front)
54+
TreeNode *node = q.front(); q.pop();
55+
if (!node)
5856
{
59-
level.push_back(front->val);
60-
if (front->left)
61-
q.push(front->left);
62-
if (front->right)
63-
q.push(front->right);
57+
res.push_back(level);
58+
level.clear();
59+
if (q.empty()) break; // end
60+
q.push(NULL);
6461
}
6562
else
6663
{
67-
if (q.size() > 0) // CAUTIOUS! infinite loop
68-
q.push(NULL);
69-
res.push_back(level);
70-
level.clear();
64+
level.push_back(node->val);
65+
if (node->left) q.push(node->left);
66+
if (node->right) q.push(node->right);
7167
}
7268
}
73-
7469
return res;
7570
}
7671

BinaryTreeLevelOrderTraversalII.h

Lines changed: 14 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@
2222
[3],
2323
]
2424
25-
Solution:
26-
1. Queue version. On the basis of 'Binary Tree Level Order Traversal', reverse the final vector.
27-
2. Stack version. Store each level in the vector and then push the vector into stack.
25+
Solution: Queue version. On the basis of 'Binary Tree Level Order Traversal', reverse the final vector.
2826
*/
2927

3028
/**
@@ -38,82 +36,32 @@
3836
*/
3937
class Solution {
4038
public:
41-
vector<vector<int> > levelOrderBottom_1(TreeNode *root) {
39+
vector<vector<int> > levelOrderBottom(TreeNode *root) {
4240
vector<vector<int>> root2leaf;
43-
4441
queue<TreeNode *> q;
45-
if (root)
46-
{
47-
q.push(root);
48-
q.push(NULL); // end indicator of one level
49-
}
50-
42+
if (!root) return root2leaf;
43+
q.push(root);
44+
q.push(NULL); // end indicator of one level
5145
vector<int> level;
52-
while (q.size() > 0)
46+
while (true)
5347
{
54-
TreeNode *front = q.front();
55-
q.pop();
56-
if (front)
48+
TreeNode *node = q.front(); q.pop();
49+
if (node)
5750
{
58-
level.push_back(front->val);
59-
if (front->left)
60-
q.push(front->left);
61-
if (front->right)
62-
q.push(front->right);
51+
level.push_back(node->val);
52+
if (node->left) q.push(node->left);
53+
if (node->right) q.push(node->right);
6354
}
6455
else
6556
{
66-
if (q.size() > 0) // CAUTIOUS! infinite loop
67-
q.push(NULL);
6857
root2leaf.push_back(level);
6958
level.clear();
59+
if (q.empty()) break; // CAUTIOUS! infinite loop
60+
q.push(NULL);
7061
}
7162
}
72-
7363
// reverse
7464
reverse(root2leaf.begin(), root2leaf.end());
7565
return root2leaf;
7666
}
77-
78-
vector<vector<int> > levelOrderBottom_2(TreeNode *root) {
79-
vector<vector<int>> res;
80-
81-
if (!root)
82-
return res;
83-
84-
stack<vector<TreeNode *>> stk;
85-
vector<TreeNode *> level;
86-
level.push_back(root);
87-
stk.push(level);
88-
89-
while (true)
90-
{
91-
level.clear();
92-
for (size_t i = 0; i < stk.top().size(); i++)
93-
{
94-
if (stk.top()[i]->left)
95-
level.push_back(stk.top()[i]->left);
96-
if (stk.top()[i]->right)
97-
level.push_back(stk.top()[i]->right);
98-
}
99-
100-
if (level.size() == 0)
101-
break;
102-
103-
stk.push(level);
104-
}
105-
106-
while (stk.size() > 0)
107-
{
108-
vector<int> level_val;
109-
for (size_t i = 0; i < stk.top().size(); i++)
110-
{
111-
level_val.push_back(stk.top()[i]->val);
112-
}
113-
res.push_back(level_val);
114-
stk.pop();
115-
}
116-
117-
return res;
118-
}
119-
};
67+
};

Combinations.h

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
Author: Annie Kim, [email protected]
33
Date: May 5, 2013
4+
Update: Sep 28, 2013
45
Problem: Combinations
56
Difficulty: Easy
67
Source: http://leetcode.com/onlinejudge#question_77
@@ -22,25 +23,22 @@
2223

2324
class Solution {
2425
public:
25-
vector<vector<int>> res;
26-
vector<vector<int>> combine(int n, int k) {
27-
res.clear();
26+
vector<vector<int> > combine(int n, int k) {
27+
vector<vector<int> > res;
2828
vector<int> com;
29-
combineRe(n, k, com, -1, 0);
29+
combineRe(n, k, 1, com, res);
3030
return res;
3131
}
32-
33-
void combineRe(int n, int k, vector<int> &com, int last, int deep)
34-
{
35-
if (deep == k)
36-
{
32+
33+
void combineRe(int n, int k, int start, vector<int> &com, vector<vector<int> > &res){
34+
int m = com.size();
35+
if (m == k) {
3736
res.push_back(com);
3837
return;
3938
}
40-
for (int i = last + 1; i < n; ++i)
41-
{
42-
com.push_back(i+1);
43-
combineRe(n, k, com, i, deep + 1);
39+
for (int i = start; i <= n-(k-m)+1; ++i) {
40+
com.push_back(i);
41+
combineRe(n, k, i+1, com, res);
4442
com.pop_back();
4543
}
4644
}

EditDistance.h

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
Author: Annie Kim, [email protected]
33
Date: Apr 7, 2013
4-
Update: Jul 24, 2013
4+
Update: Sep 28, 2013
55
Problem: Edit Distance
66
Difficulty: Medium
77
Source: http://leetcode.com/onlinejudge#question_72
@@ -24,15 +24,12 @@ class Solution {
2424
}
2525

2626
int minDistance_1(string word1, string word2) {
27-
size_t M = word1.size();
28-
size_t N = word2.size();
29-
27+
int M = word1.size(), N = word2.size();
3028
int dp[N+1][M+1];
3129
for (int j = 0; j <= M; j++)
3230
dp[0][j] = j;
3331
for (int i = 0; i <= N; i++)
3432
dp[i][0] = i;
35-
3633
for (int i = 1; i <= N; i++)
3734
for (int j = 1; j <= M; j++)
3835
if (word2[i-1] == word1[j-1])
@@ -44,33 +41,24 @@ class Solution {
4441
}
4542

4643
int minDistance_2(string word1, string word2) {
47-
int M = word1.size();
48-
int N = word2.size();
49-
if (M == 0) return N;
50-
if (N == 0) return M;
51-
44+
int M = word1.size(), N = word2.size();
5245
int dp[N+1];
5346
for (int j = 0; j <= N; ++j)
5447
dp[j] = j;
55-
5648
for (int i = 1; i <= M; ++i)
5749
{
58-
int left = 0;
59-
int cur = 0;
60-
for (int j = 0; j <= N; ++j)
50+
int upperLeftBackup = dp[0];
51+
dp[0] = i;
52+
for (int j = 1; j <= N; ++j)
6153
{
62-
if (j == 0)
63-
cur = i;
64-
else if (word1[i-1] == word2[j-1])
65-
cur = dp[j-1];
54+
int upperLeft = upperLeftBackup;
55+
upperLeftBackup = dp[j];
56+
if (word1[i-1] == word2[j-1])
57+
dp[j] = upperLeft;
6658
else
67-
cur = min(min(dp[j-1], dp[j]), left) + 1;
68-
69-
if (j >= 1) dp[j-1] = left;
70-
left = cur;
59+
dp[j] = min(min(dp[j-1], dp[j]), upperLeft) + 1;
7160
}
72-
dp[N] = cur;
7361
}
7462
return dp[N];
7563
}
76-
};
64+
};

FlattenBinaryTreetoLinkedList.h

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
Author: Annie Kim, [email protected]
33
Date: Apr 28, 2013
4+
Update: Sep 29, 2013
45
Problem: Flatten Binary Tree to Linked List
56
Difficulty: Medium
67
Source: http://leetcode.com/onlinejudge#question_114
@@ -44,30 +45,20 @@
4445
class Solution {
4546
public:
4647
void flatten(TreeNode *root) {
47-
TreeNode *r;
48-
flattenRe(root, r);
48+
TreeNode *end = NULL;
49+
flattenRe(root, end);
4950
}
50-
51-
void flattenRe(TreeNode *node, TreeNode *&back)
52-
{
53-
back = node;
54-
if (!node || (!node->left && !node->right)) return;
55-
56-
TreeNode *leftOrig = node->left;
57-
TreeNode *rightOrig = node->right;
58-
node->right = leftOrig ? leftOrig : rightOrig;
59-
node->left = NULL;
60-
61-
TreeNode *lr, *rr;
62-
flattenRe(leftOrig, lr);
63-
flattenRe(rightOrig, rr);
64-
back = lr;
65-
if (lr) {
66-
lr->right = rightOrig;
67-
}
68-
if (rr) {
69-
back = rr;
51+
52+
void flattenRe(TreeNode *node, TreeNode *&end) {
53+
if (!node) return;
54+
TreeNode *lend = NULL, *rend = NULL;
55+
flattenRe(node->left, lend);
56+
flattenRe(node->right, rend);
57+
if (node->left) {
58+
lend->right = node->right;
59+
node->right = node->left;
60+
node->left = NULL;
7061
}
62+
end = rend ? rend : (lend ? lend : node);
7163
}
72-
};
73-
64+
};

0 commit comments

Comments
 (0)