Skip to content

Commit d922616

Browse files
committed
Update solutions.
1 parent 2b932bf commit d922616

File tree

4 files changed

+50
-118
lines changed

4 files changed

+50
-118
lines changed

4Sum.h

Lines changed: 31 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
Author: Annie Kim, [email protected]
33
Date: Apr 20, 2013
4+
Update: Sep 26, 2013
45
Problem: 4Sum
56
Difficulty: Medium
67
Source: http://leetcode.com/onlinejudge#question_18
@@ -19,109 +20,43 @@
1920
(-2, -1, 1, 2)
2021
(-2, 0, 0, 2)
2122
22-
Solution: FourSum = TwoSum + TwoSum.
23+
Solution: Similar to 3Sum, 2Sum.
2324
*/
2425

25-
struct TwoSum
26-
{
27-
int sum;
28-
int first;
29-
int second;
30-
TwoSum(int _first, int _second) {
31-
first = _first;
32-
second = _second;
33-
sum = _first + _second;
34-
}
35-
};
36-
bool increasing(TwoSum i, TwoSum j) { return (i.sum < j.sum); }
37-
3826
class Solution {
39-
private:
40-
vector<vector<int>> res;
41-
map<int, int> count;
42-
vector<int> uni;
43-
vector<TwoSum> sum;
44-
4527
public:
4628
vector<vector<int> > fourSum(vector<int> &num, int target) {
47-
res.clear();
48-
if (num.size() < 4) return res;
49-
UniqueAndCount(num);
50-
buildTwoSum();
51-
searchResult(target);
52-
return res;
53-
}
54-
55-
private:
56-
void UniqueAndCount(const vector<int> &num)
57-
{
58-
count.clear();
59-
uni.clear();
60-
for (int i = 0; i < num.size(); ++i) {
61-
if (count[num[i]] == 0)
62-
uni.push_back(num[i]);
63-
count[num[i]]++;
64-
}
65-
}
66-
67-
void buildTwoSum()
68-
{
69-
sum.clear();
70-
for (int i = 0; i < uni.size(); ++i)
71-
for (int j = i + 1; j < uni.size(); ++j)
72-
sum.push_back(TwoSum(uni[i], uni[j]));
73-
// for duplicate numbers
74-
for (map<int,int>::iterator it = count.begin(); it != count.end(); ++it)
75-
if ((*it).second > 1)
76-
sum.push_back(TwoSum((*it).first, (*it).first));
77-
sort(sum.begin(), sum.end(), increasing);
78-
}
79-
80-
void searchResult(int target)
81-
{
82-
int i = 0; int j = sum.size() - 1;
83-
while (i < j)
29+
int N = num.size();
30+
vector<vector<int> > res;
31+
if (N < 4) return res;
32+
sort(num.begin(), num.end());
33+
for (int i = 0; i < N; ++i)
8434
{
85-
int s = sum[i].sum + sum[j].sum;
86-
if (s == target) {
87-
int m = i, n = j;
88-
while (m < j && sum[m].sum == sum[i].sum) {
89-
n = j;
90-
while (m < n && sum[n].sum == sum[j].sum)
91-
pushResult(sum[m], sum[n--]);
92-
m++;
35+
if (i > 0 && num[i] == num[i-1]) continue; // avoid duplicates
36+
for (int j = i+1; j < N; ++j)
37+
{
38+
if (j > i+1 && num[j] == num[j-1]) continue; // avoid duplicates
39+
int twosum = target - num[i] - num[j];
40+
int l = j + 1, r = N - 1;
41+
while (l < r)
42+
{
43+
int sum = num[l] + num[r];
44+
if (sum == twosum) {
45+
vector<int> quadruplet(4);
46+
quadruplet[0] = num[i];
47+
quadruplet[1] = num[j];
48+
quadruplet[2] = num[l];
49+
quadruplet[3] = num[r];
50+
res.push_back(quadruplet);
51+
while (l < r && num[l+1] == num[l]) l++; // avoid duplicates
52+
while (l < r && num[r-1] == num[r]) r--; // avoid duplicates
53+
l++; r--;
54+
}
55+
else if (sum < twosum) l++;
56+
else r--;
9357
}
94-
i = m;
95-
j = n;
96-
} else if (s < target) {
97-
i++;
98-
} else {
99-
j--;
10058
}
10159
}
102-
// for the numbers that have more than 4 copies
103-
for (map<int,int>::iterator it = count.begin(); it != count.end(); ++it)
104-
if ((*it).second >= 4 && (*it).first * 4 == target)
105-
pushResult(TwoSum((*it).first, (*it).first), TwoSum((*it).first, (*it).first));
106-
}
107-
108-
void pushResult(const TwoSum &a, const TwoSum &b)
109-
{
110-
vector<int> quadruplet;
111-
quadruplet.push_back(a.first);
112-
quadruplet.push_back(a.second);
113-
quadruplet.push_back(b.first);
114-
quadruplet.push_back(b.second);
115-
// check counts
116-
map<int, int> used;
117-
for (int i = 0; i < quadruplet.size(); ++i)
118-
used[quadruplet[i]]++;
119-
for (map<int, int>::iterator it = used.begin(); it != used.end(); ++it)
120-
if ((*it).second > count[(*it).first])
121-
return;
122-
// avoid duplicates
123-
sort(quadruplet.begin(), quadruplet.end());
124-
if (find(res.begin(), res.end(), quadruplet) == res.end())
125-
res.push_back(quadruplet);
60+
return res;
12661
}
127-
};
62+
};

ReverseInteger.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Solution {
2626
res = res * 10 + (x % 10);
2727
x /= 10;
2828
}
29-
assert(res > INT_MIN && res < INT_MAX);
29+
assert(res >= INT_MIN && res <= INT_MAX);
3030
return res;
3131
}
32-
};
32+
};

ValidateBinarySearchTree.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
Both the left and right subtrees must also be binary search trees.
1414
1515
Solution: Recursion. 1. Add lower & upper bound. O(n)
16-
2. Inorder traversal with one addition parameter (value of predecessor). O(n)
16+
2. Inorder traversal with one additional parameter (value of predecessor). O(n)
1717
*/
1818

1919
/**

ZigZagConversion.h

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
Author: Annie Kim, [email protected]
33
Date: Apr 7, 2013
4+
Update: Sep 26, 2013
45
Problem: ZigZag Conversion
56
Difficulty: Easy
67
Source: http://leetcode.com/onlinejudge#question_6
@@ -16,33 +17,29 @@
1617
string convert(string text, int nRows);
1718
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".
1819
19-
Solution: It's done if you find the rule!
20+
Solution: ...
2021
*/
2122

2223
class Solution {
2324
public:
2425
string convert(string s, int nRows) {
25-
if (nRows == 1) return s;
26+
if (nRows == 1) return s;
2627
string res;
27-
int offset = 2 * (nRows - 1);
28-
for (int i = 0; i < nRows; i++)
28+
int inc = (nRows - 1) * 2, N = s.size();
29+
for (int i = 0; i < nRows; ++i)
2930
{
30-
if (i == 0 || i == nRows-1) {
31-
for (int j = i; j < s.size(); j += offset)
32-
res.push_back(s[j]);
33-
} else {
34-
int j_1 = i;
35-
int j_2 = j_1 + offset - i * 2;
36-
bool use_1 = true;
37-
while (use_1 ? j_1 < s.size() : j_2 < s.size())
38-
{
39-
res.push_back(use_1 ? s[j_1] : s[j_2]);
40-
j_1 = use_1? j_1 + offset : j_1;
41-
j_2 = use_1? j_2 : j_2 + offset;
42-
use_1 = !use_1;
43-
}
31+
int j = 0;
32+
while (true)
33+
{
34+
if (i > 0 && i < nRows-1 && j-i >= 0 && j-i < N)
35+
res.push_back(s[j-i]);
36+
if (j+i < N)
37+
res.push_back(s[j+i]);
38+
if (j+i >= N)
39+
break;
40+
j += inc;
4441
}
45-
}
42+
}
4643
return res;
4744
}
4845
};

0 commit comments

Comments
 (0)