Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 47d987d

Browse files
author
kaidul
committedMay 25, 2018
Facebook Interview: 2.0 preparation
1 parent 26bd72f commit 47d987d

11 files changed

+976
-591
lines changed
 

‎README.md

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

‎readme-generator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@ int main(void) {
4343
perror ("Directory open failed.");
4444
return EXIT_FAILURE;
4545
}
46+
printf("Success!");
4647
return EXIT_SUCCESS;
4748
}

‎source-code/01_Matrix.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Solution {
2727
}
2828
}
2929
}
30-
30+
3131
return matrix;
3232
}
33-
};
33+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Solution {
2+
int boundaryIndx(vector<int>& arr, int left, int target) {
3+
int right = arr.size() - 1;
4+
int indx = left;
5+
while(left <= right) {
6+
int mid = left + (right - left) / 2;
7+
if(target < arr[mid]) {
8+
left = mid + 1;
9+
indx = mid;
10+
} else {
11+
right = mid - 1;
12+
}
13+
}
14+
return indx;
15+
}
16+
public:
17+
int numFriendRequests(vector<int>& ages) {
18+
int result = 0;
19+
sort(ages.begin(), ages.end(), greater<int>());
20+
for(int i = 0; i < ages.size(); i++) {
21+
int bAge = ages[i] / 2 + 7;
22+
int boundary = boundaryIndx(ages, i, bAge);
23+
int frndReq = (boundary - i);
24+
result += frndReq;
25+
while(i + 1 < ages.size() and ages[i] == ages[i + 1]) {
26+
result += frndReq;
27+
i++;
28+
}
29+
}
30+
return result;
31+
}
32+
};

‎source-code/Is_Graph_Bipartite?.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution {
2+
enum Color {
3+
WHITE = 1,
4+
BLACK = 2
5+
};
6+
7+
bool isBipartite(int node, vector<vector<int>> const& graph, vector<int>& color) {
8+
for(int i = 0; i < graph[node].size(); i++) {
9+
int neigh = graph[node][i];
10+
if(color[neigh] and color[neigh] == color[node]) {
11+
return false;
12+
}
13+
if(!color[neigh]) {
14+
color[neigh] = (color[node] == WHITE ? BLACK : WHITE);
15+
if(!isBipartite(neigh, graph, color)) {
16+
return false;
17+
}
18+
}
19+
}
20+
return true;
21+
}
22+
23+
public:
24+
bool isBipartite(vector<vector<int>>& graph) {
25+
int n = (int)graph.size();
26+
vector<int> color(n, 0);
27+
for(int node = 0; node < n; node++) {
28+
if(!color[node]) {
29+
color[node] = WHITE;
30+
if(!isBipartite(node, graph, color)) {
31+
return false;
32+
}
33+
}
34+
}
35+
return true;
36+
}
37+
};

‎source-code/Largest_Plus_Sign.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
class Solution {
2+
public:
3+
int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
4+
vector<vector<int>> left(N, vector<int>(N, 1));
5+
vector<vector<int>> right(left), up(left), down(left);
6+
7+
for(int i = 0; i < mines.size(); i++) {
8+
int x = mines[i][0], y = mines[i][1];
9+
left[x][y] = right[x][y] = up[x][y] = down[x][y] = 0;
10+
}
11+
12+
for(int i = 0; i < N; i++) {
13+
for(int j = 0, k = N - 1; j < N; j++, k--) {
14+
if(left[i][j] and j > 0) {
15+
left[i][j] += left[i][j - 1];
16+
}
17+
if(right[i][k] and k + 1 < N) {
18+
right[i][k] += right[i][k + 1];
19+
}
20+
if(up[j][i] and j > 0) {
21+
up[j][i] += up[j - 1][i];
22+
}
23+
if(down[k][i] and k + 1 < N) {
24+
down[k][i] += down[k + 1][i];
25+
}
26+
}
27+
}
28+
29+
int result = 0;
30+
for(int i = 0; i < N; i++) {
31+
for(int j = 0, l = N - 1; j < N; j++, l--) {
32+
if(left[i][j]) {
33+
int k = left[i][j] / 2;
34+
35+
int centerX = i, centerY = j - k;
36+
if(centerX - k >= 0 and centerX + k < N and centerY - k >= 0) {
37+
bool plus = min(min(right[centerX][centerY - k], up[centerX + k][centerY]), down[centerX - k][centerY]) >= left[i][j];
38+
if(plus) {
39+
int order = k + 1;
40+
result = max(result, order);
41+
}
42+
}
43+
}
44+
45+
if(right[i][l]) {
46+
int k = right[i][l] / 2;
47+
48+
int centerX = i, centerY = l + k;
49+
if(centerX - k >= 0 and centerX + k < N and centerY + k < N) {
50+
bool plus = min(min(left[centerX][centerY + k], up[centerX + k][centerY]), down[centerX - k][centerY]) >= right[i][l];
51+
if(plus) {
52+
int order = k + 1;
53+
result = max(result, order);
54+
}
55+
}
56+
}
57+
58+
if(up[j][i]) {
59+
int k = up[j][i] / 2;
60+
61+
int centerX = j - k, centerY = i;
62+
if(centerX - k >= 0 and centerY + k < N and centerY - k >= 0) {
63+
bool plus = min(min(right[centerX][centerY - k], left[centerX][centerY + k]), down[centerX - k][centerY]) >= up[j][i];
64+
if(plus) {
65+
int order = k + 1;
66+
result = max(result, order);
67+
}
68+
}
69+
}
70+
71+
if(down[l][i]) {
72+
int k = down[l][i] / 2;
73+
74+
int centerX = l + k, centerY = i;
75+
if(centerX + k < N and centerX + k < N and centerY - k >= 0) {
76+
bool plus = min(min(right[centerX][centerY - k], left[centerX][centerY + k]), up[centerX + k][centerY]) >= down[l][i];
77+
if(plus) {
78+
int order = k + 1;
79+
result = max(result, order);
80+
}
81+
}
82+
}
83+
}
84+
}
85+
return result;
86+
}
87+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
void letterCasePermutation(int indx, string& S, vector<string>& result) {
3+
if(indx == S.length()) {
4+
result.push_back(S);
5+
return;
6+
}
7+
if(isalpha(S[indx])) {
8+
S[indx] = islower(S[indx]) ? toupper(S[indx]) : tolower(S[indx]);
9+
letterCasePermutation(indx + 1, S, result);
10+
S[indx] = islower(S[indx]) ? toupper(S[indx]) : tolower(S[indx]);
11+
}
12+
letterCasePermutation(indx + 1, S, result);
13+
}
14+
15+
public:
16+
vector<string> letterCasePermutation(string S) {
17+
vector<string> result;
18+
letterCasePermutation(0, S, result);
19+
return result;
20+
}
21+
};

‎source-code/Maximum_Product_Subarray.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Solution {
22
public:
3-
int maxProduct(int A[], int n) {
3+
int maxProduct(vector<int> A) {
4+
int n = (int)A.size();
45
int res = A[0];
56
int pos = max(0, A[0]);
67
int neg = min(0, A[0]);
@@ -20,4 +21,4 @@ class Solution {
2021
}
2122
return res;
2223
}
23-
};
24+
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
class Solution {
2+
bool isSwappable(int indx, vector<int>& A, vector<int>& B) {
3+
return indx == 0 or (indx > 0 and A[indx] > B[indx - 1] and B[indx] > A[indx - 1]);
4+
}
5+
6+
bool isOkay(int indx, vector<int>& A, vector<int>& B) {
7+
return indx == 0 or (indx > 0 and A[indx] > A[indx - 1] and B[indx] > B[indx - 1]);
8+
}
9+
10+
int minSwap(int indx, bool swapped, vector<int>& A, vector<int>& B, vector<vector<int>>& dp) {
11+
if(indx == (int)A.size()) {
12+
return 0;
13+
}
14+
15+
if(dp[indx][swapped] != -1) {
16+
return dp[indx][swapped];
17+
}
18+
19+
int ret = INT_MAX;
20+
21+
if(isOkay(indx, A, B)) {
22+
if(isSwappable(indx, A, B)) {
23+
swap(A[indx], B[indx]);
24+
ret = min(ret, 1 + minSwap(indx + 1, true, A, B, dp));
25+
swap(A[indx], B[indx]);
26+
}
27+
ret = min(ret, minSwap(indx + 1, false, A, B, dp));
28+
}
29+
30+
if(isSwappable(indx, A, B)) {
31+
swap(A[indx], B[indx]);
32+
ret = min(ret, 1 + minSwap(indx + 1, true, A, B, dp));
33+
swap(A[indx], B[indx]);
34+
}
35+
36+
return dp[indx][swapped] = ret;
37+
}
38+
39+
public:
40+
int minSwap(vector<int>& A, vector<int>& B) {
41+
int n = (int)A.size();
42+
vector<vector<int>> dp(n, vector<int>(2, -1));
43+
return minSwap(0, 0, A, B, dp);
44+
}
45+
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int countCornerRectangles(vector<vector<int>>& grid) {
4+
int rows = (int)grid.size();
5+
int cols = (int)grid.at(0).size();
6+
vector<vector<int>> columnPair(rows, vector<int>(cols, 0));
7+
int result = 0;
8+
for(int i = 0; i < rows; i++) {
9+
for(int j = 0; j < cols; j++) {
10+
if(grid[i][j]) {
11+
for(int k = j + 1; k < cols; k++) {
12+
if(grid[i][k]) {
13+
result += columnPair[j][k];
14+
columnPair[j][k]++;
15+
}
16+
}
17+
}
18+
}
19+
}
20+
return result;
21+
}
22+
};
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
class WordFilter {
2+
class Trie {
3+
static const int SIZE = 26;
4+
private:
5+
struct trieNode {
6+
int weight;
7+
trieNode* children[SIZE];
8+
trieNode(): weight(-1) {
9+
for(int i = 0; i < SIZE; ++i) {
10+
children[i] = nullptr;
11+
}
12+
}
13+
~trieNode() {
14+
for(int i = 0; i < SIZE; ++i) {
15+
delete children[i];
16+
children[i] = nullptr;
17+
}
18+
}
19+
};
20+
trieNode* root;
21+
public:
22+
Trie(): root(new trieNode()) {
23+
}
24+
25+
~Trie() {
26+
delete root;
27+
root = nullptr;
28+
}
29+
30+
void insert(string const& key, int weight, bool reverse = false) {
31+
trieNode* pCrawl = root;
32+
if(!reverse) {
33+
for(int i = 0; i < key.length(); ++i) {
34+
int indx = key[i] - 'a';
35+
if(!pCrawl->children[indx]) {
36+
pCrawl->children[indx] = new trieNode();
37+
}
38+
pCrawl = pCrawl->children[indx];
39+
}
40+
pCrawl->weight = weight;
41+
42+
return;
43+
}
44+
45+
for(int i = key.length() - 1; i >= 0; --i) {
46+
int indx = key[i] - 'a';
47+
if(!pCrawl->children[indx]) {
48+
pCrawl->children[indx] = new trieNode();
49+
}
50+
pCrawl = pCrawl->children[indx];
51+
}
52+
pCrawl->weight = weight;
53+
}
54+
55+
void searchUtil(trieNode* pCrawl, unordered_set<int>& prefixMatchedSet) {
56+
if(pCrawl->weight != -1) {
57+
prefixMatchedSet.insert(pCrawl->weight);
58+
}
59+
for(int i = 0; i < SIZE; i++) {
60+
if(pCrawl->children[i]) {
61+
searchUtil(pCrawl->children[i], prefixMatchedSet);
62+
}
63+
}
64+
}
65+
66+
void search(string const& prefix, unordered_set<int>& prefixMatchedSet) {
67+
trieNode *pCrawl = root;
68+
for(int i = 0; i < prefix.length(); ++i) {
69+
int indx = prefix[i] - 'a';
70+
if(!pCrawl->children[indx]) {
71+
return;
72+
}
73+
pCrawl = pCrawl->children[indx];
74+
}
75+
searchUtil(pCrawl, prefixMatchedSet);
76+
}
77+
78+
int searchUtil2(trieNode* pCrawl, unordered_set<int>& prefixMatchedSet) {
79+
int weight = -1;
80+
if(pCrawl->weight != -1) {
81+
if(prefixMatchedSet.find(pCrawl->weight) != prefixMatchedSet.end()) {
82+
weight = max(weight, pCrawl->weight);
83+
}
84+
}
85+
for(int i = 0; i < SIZE; i++) {
86+
if(pCrawl->children[i]) {
87+
weight = max(weight, searchUtil2(pCrawl->children[i], prefixMatchedSet));
88+
}
89+
}
90+
91+
return weight;
92+
}
93+
94+
int search2(string const& suffix, unordered_set<int>& prefixMatchedSet) {
95+
trieNode *pCrawl = root;
96+
for(int i = suffix.length() - 1; i >= 0; --i) {
97+
int indx = suffix[i] - 'a';
98+
if(!pCrawl->children[indx]) {
99+
return -1;
100+
}
101+
pCrawl = pCrawl->children[indx];
102+
}
103+
return searchUtil2(pCrawl, prefixMatchedSet);
104+
}
105+
};
106+
107+
Trie* prefixTrie;
108+
Trie* suffixTrie;
109+
public:
110+
WordFilter(vector<string> words) {
111+
prefixTrie = new Trie();
112+
suffixTrie = new Trie();
113+
for(int i = 0; i < words.size(); i++) {
114+
prefixTrie->insert(words[i], i);
115+
suffixTrie->insert(words[i], i, true);
116+
}
117+
}
118+
119+
int f(string prefix, string suffix) {
120+
unordered_set<int> prefixMatchedSet;
121+
prefixTrie->search(prefix, prefixMatchedSet);
122+
return suffixTrie->search2(suffix, prefixMatchedSet);
123+
}
124+
};
125+
126+
/**
127+
* Your WordFilter object will be instantiated and called as such:
128+
* WordFilter obj = new WordFilter(words);
129+
* int param_1 = obj.f(prefix,suffix);
130+
*/

0 commit comments

Comments
 (0)
Please sign in to comment.