Skip to content

Commit 2802d39

Browse files
author
kaidul
committed
kill process solved and readme generator bug fixed
1 parent 5099844 commit 2802d39

9 files changed

+777
-658
lines changed

README.md

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

readme-generator.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
#include <algorithm>
12
#include <cstdio>
23
#include <cstdlib>
34
#include <fstream>
45
#include <string>
56
#include <cstring>
67
#include <cassert>
78
#include <dirent.h>
9+
#include<vector>
810
using namespace std;
911

1012
int main(void) {
@@ -13,8 +15,8 @@ int main(void) {
1315
DIR *dir;
1416
const char *directoryPath = "/Users/kaidul/LeetCode_problems_solution/source-code/";
1517
struct dirent *ent;
16-
int serialNo = 0;
1718
if ((dir = opendir (directoryPath)) != NULL) {
19+
vector<string> listItems;
1820
while ((ent = readdir (dir)) != NULL) {
1921
int n = strlen(ent->d_name);
2022
if(n < 5) { // skip hidden files
@@ -35,8 +37,15 @@ int main(void) {
3537
int dot = sFileName.find('.');
3638
assert(dot != string::npos);
3739
sFileName = sFileName.substr(0, dot); // trimming extension
38-
printf("%d. [%s](source-code/%s)\n", ++serialNo, sFileName.c_str(), ent->d_name);
40+
char buffer[512];
41+
sprintf(buffer, "[%s](source-code/%s)", sFileName.c_str(), ent->d_name);
42+
listItems.push_back(string(buffer));
3943
}
44+
sort(listItems.begin(), listItems.end());
45+
int serialNo = 0;
46+
for(string const& item : listItems) {
47+
printf("%d. %s\n", ++serialNo, item.c_str());
48+
}
4049
closedir (dir);
4150
} else {
4251
/* could not open directory */

source-code/Binary_Search_Tree_Iterator.cpp

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,43 @@
77
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
88
* };
99
*/
10+
class BSTIterator {
11+
stack<TreeNode*> nodeStack;
12+
13+
void pushAllLefts(TreeNode* node) {
14+
while(node) {
15+
nodeStack.push(node);
16+
node = node->left;
17+
}
18+
}
19+
public:
20+
BSTIterator(TreeNode *root) {
21+
pushAllLefts(root);
22+
}
23+
24+
/** @return whether we have a next smallest number */
25+
bool hasNext() {
26+
return !nodeStack.empty();
27+
}
28+
29+
/** @return the next smallest number */
30+
int next() {
31+
TreeNode* current = nodeStack.top();
32+
nodeStack.pop();
33+
pushAllLefts(current->right);
34+
return current->val;
35+
}
36+
};
37+
38+
/**
39+
* Your BSTIterator will be called like this:
40+
* BSTIterator i = BSTIterator(root);
41+
* while (i.hasNext()) cout << i.next();
42+
*/
43+
44+
45+
// more than O(h) extra space
46+
// O(n) space
1047
class BSTIterator {
1148
vector<int> nodes;
1249
vector<int>::iterator iter;
@@ -35,9 +72,3 @@ class BSTIterator {
3572
return (*iter++);
3673
}
3774
};
38-
39-
/**
40-
* Your BSTIterator will be called like this:
41-
* BSTIterator i = BSTIterator(root);
42-
* while (i.hasNext()) cout << i.next();
43-
*/

source-code/Course_Schedule.cpp

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,68 @@
11
class Solution {
22
public:
3-
bool hasCycle(int course, vector<vector<int> >& adj, vector<bool>& visited, vector<bool>& recursionStack) {
3+
bool hasCycle(int course, vector<vector<int> >& adj, vector<bool>& visited) {
44
visited[course] = true;
5-
recursionStack[course] = true;
65
for(int i = 0; i < (int)adj[course].size(); ++i) {
7-
if(!visited[adj[course][i]]) {
8-
if(hasCycle(adj[course][i], adj, visited, recursionStack)) {
6+
if(visited[adj[course][i]]) {
7+
return true;
8+
}
9+
if(hasCycle(adj[course][i], adj, visited)) {
10+
return true;
11+
}
12+
}
13+
visited[course] = false;
14+
return false;
15+
}
16+
17+
enum Color {
18+
WHITE, GREY, BLACK
19+
};
20+
21+
bool hasCycle2(int course, vector<vector<int>> const& adj, vector<int>& color) {
22+
color[course] = GREY;
23+
for(int i = 0; i < (int)adj[course].size(); ++i) {
24+
int neigh = adj[course][i];
25+
if(color[neigh] == GREY) {
26+
return true;
27+
}
28+
if(color[neigh] == WHITE) {
29+
if(hasCycle2(neigh, adj, color)) {
930
return true;
1031
}
11-
} else if(recursionStack[adj[course][i]]) {
12-
return true;
1332
}
1433
}
15-
recursionStack[course] = false;
34+
color[course] = BLACK;
35+
1636
return false;
1737
}
38+
1839

19-
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
20-
if(numCourses < 1) return true;
21-
vector<vector<int> > adj;
22-
adj.resize(numCourses);
23-
int edges = prerequisites.size();
24-
for(int i = 0; i < edges; ++i) {
25-
int u = prerequisites[i][0];
26-
int v = prerequisites[i][1];
40+
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
41+
if(numCourses < 1) return true;
42+
vector<vector<int> > adj;
43+
adj.resize(numCourses);
44+
int edges = prerequisites.size();
45+
for(int i = 0; i < edges; ++i) {
46+
int u = prerequisites[i].first;
47+
int v = prerequisites[i].second;
2748
adj[u].push_back(v);
28-
}
29-
vector<bool> visited(numCourses, false);
30-
vector<bool> recursionStack(numCourses, false);
31-
32-
for(int course = 0; course < numCourses; ++course) {
33-
if(!visited[course]) {
34-
if(hasCycle(course, adj, visited, recursionStack))
49+
}
50+
vector<bool> visited(numCourses, false);
51+
vector<int> color(numCourses, WHITE);
52+
/*
53+
for(int course = 0; course < numCourses; ++course) {
54+
if(!visited[course]) {
55+
if(hasCycle(course, adj, visited))
56+
return false;
57+
}
58+
}
59+
*/
60+
for(int course = 0; course < numCourses; ++course) {
61+
if(color[course] == WHITE) {
62+
if(hasCycle2(course, adj, color))
3563
return false;
36-
}
37-
}
38-
return true;
64+
}
65+
}
66+
return true;
3967
}
4068
};

source-code/Excel_Sheet_Column_Title.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,19 @@ class Solution {
1414
};
1515

1616
// iterative
17-
string convertToTitle(int n) {
18-
string ans;
19-
while (n-- != 0) {
20-
ans = char(int('A') + n % 26) + ans;
21-
n /= 26;
17+
class Solution {
18+
public:
19+
string convertToTitle(int n) {
20+
string ans = "";
21+
while(n) {
22+
if(n % 26 == 0) {
23+
ans = 'Z' + ans;
24+
n--;
25+
} else {
26+
ans = char('A' + (n % 26) - 1) + ans;
27+
}
28+
n /= 26;
29+
}
30+
return ans;
2231
}
23-
return ans;
24-
}
32+
};

source-code/Kill_Process.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
void killProcess(int kill, unordered_map<int, vector<int>>& adj, vector<int>& processes) {
3+
for(auto pidIter = adj[kill].begin(); pidIter != adj[kill].end(); ++pidIter) {
4+
killProcess(*pidIter, adj, processes);
5+
}
6+
processes.push_back(kill);
7+
}
8+
9+
public:
10+
vector<int> killProcess(vector<int>& pid, vector<int>& ppid, int kill) {
11+
unordered_map<int, vector<int>> adj;
12+
for(int i = 0; i < pid.size(); i++) {
13+
if(adj.find(ppid[i]) == adj.end()) {
14+
adj[ppid[i]] = vector<int>();
15+
}
16+
adj[ppid[i]].push_back(pid[i]);
17+
}
18+
vector<int> processes;
19+
killProcess(kill, adj, processes);
20+
21+
return processes;
22+
}
23+
};

source-code/Minimum_Size_Subarray_Sum.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,38 @@
1+
// two pointers O(n)
12
class Solution {
3+
public:
4+
int minSubArrayLen(int target, vector<int>& nums) {
5+
int minLen = INT_MAX;
6+
int n = nums.size();
7+
if(n == 0) return 0;
8+
int i = 0, k = 0, sum = 0;
9+
while(i < n) {
10+
sum += nums[i++];
11+
while(sum >= target) {
12+
minLen = min(minLen, i - k);
13+
sum -= nums[k++];
14+
}
15+
}
16+
return minLen == INT_MAX ? 0 : minLen;
17+
}
18+
};
19+
20+
// O(nlogn)
21+
class Solution {
22+
// find the right-most occurance of value X such that X <= target
223
int upperBound(vector<int> const& nums, int right, int target) {
324
int left = 0;
4-
while(left < right) {
25+
int indx = -1;
26+
while(left <= right) {
527
int mid = left + (right - left) / 2;
628
if(nums[mid] > target) {
7-
right = mid;
29+
right = mid - 1;
830
} else if(nums[mid] <= target) {
31+
indx = mid;
932
left = mid + 1;
1033
}
1134
}
12-
return left;
35+
return indx;
1336
}
1437
public:
1538
int minSubArrayLen(int target, vector<int>& nums) {
@@ -20,8 +43,8 @@ class Solution {
2043
for(int i = 0; i < n; ++i) {
2144
sum[i] = (i > 0 ? sum[i - 1] : 0) + nums[i];
2245
if(sum[i] >= target) {
23-
int upper_bound = upperBound(sum, i, sum[i] - target);
24-
minLen = min(minLen, i - upper_bound + 1);
46+
int upper_bound = upperBound(sum, i - 1, sum[i] - target);
47+
minLen = min(minLen, i - upper_bound);
2548
}
2649
}
2750
return (minLen != INT_MAX ? minLen : 0);

source-code/Palindrome_Linked_List.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,15 @@ class Solution {
3434
if(!head and !head->next) {
3535
return head;
3636
}
37-
ListNode* prev = head;
38-
ListNode* curr = head->next;
39-
ListNode* tail = head;
40-
while(curr) {
41-
ListNode* nxt = curr->next;
42-
curr->next = head;
43-
head = curr;
44-
curr= nxt;
45-
}
46-
tail->next = NULL;
47-
37+
ListNode* curr = head;
38+
ListNode* prev = nullptr;
39+
while(curr) {
40+
ListNode* nxt = curr->next;
41+
curr->next = prev;
42+
prev = curr;
43+
head = curr;
44+
curr = nxt;
45+
}
4846
return head;
4947
}
5048

@@ -67,9 +65,7 @@ class Solution {
6765
fast = fast->next;
6866
}
6967
}
70-
ListNode* middleNode = NULL;
7168
if(length & 1) {
72-
middleNode = slow;
7369
slow = slow->next;
7470
}
7571
ListNode* secondHalf = reverseList(slow);

source-code/Read_N_Characters_Given_Read4.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ class Solution {
99
* @return The number of characters read
1010
*/
1111
int read(char *buf, int n) {
12-
int cnt = 0;
12+
int idx = 0;
1313
char* buf4 = new char[4];
14-
while(cnt < n) {
14+
while(idx < n) {
1515
int len = read4(buf4);
16-
for(int i = 0; i < min(len, n - cnt); ++i) {
17-
buf[cnt++] = buf4[i];
16+
for(int i = 0, m = min(len, n - idx); i < m; ++i) {
17+
buf[idx++] = buf4[i];
1818
}
1919
if(len < 4) {
2020
break;
2121
}
2222
}
23-
return cnt;
23+
return idx;
2424
}
25-
};
25+
};

0 commit comments

Comments
 (0)