Skip to content
This repository was archived by the owner on May 16, 2021. It is now read-only.

Commit 2df38b3

Browse files
committed
add 6 problems
1 parent a25366e commit 2df38b3

6 files changed

+314
-0
lines changed

add-one-row-to-tree_1_AC.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// I don't know why such boring problems should appear one after one on Leetcode.
2+
/**
3+
* Definition for a binary tree node.
4+
* struct TreeNode {
5+
* int val;
6+
* TreeNode *left;
7+
* TreeNode *right;
8+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
9+
* };
10+
*/
11+
#include <queue>
12+
#include <utility>
13+
using std::make_pair;
14+
using std::pair;
15+
using std::queue;
16+
17+
class Solution {
18+
public:
19+
TreeNode* addOneRow(TreeNode* root, int v, int d) {
20+
if (d <= 0) {
21+
return root;
22+
}
23+
24+
TreeNode *p;
25+
if (d == 1) {
26+
p = new TreeNode(v);
27+
p->left = root;
28+
return p;
29+
}
30+
31+
queue<pair<TreeNode *, int>> q;
32+
q.push(make_pair(root, 1));
33+
34+
TreeNode *p1, *p2;
35+
pair<TreeNode *, int> pr;
36+
while (!q.empty()) {
37+
pr = q.front();
38+
q.pop();
39+
40+
p = pr.first;
41+
if (pr.second < d - 1) {
42+
if (p->left != NULL) {
43+
q.push(make_pair(p->left, pr.second + 1));
44+
}
45+
if (p->right != NULL) {
46+
q.push(make_pair(p->right, pr.second + 1));
47+
}
48+
} else {
49+
p1 = p->left;
50+
p->left = new TreeNode(v);
51+
p->left->left = p1;
52+
53+
p2 = p->right;
54+
p->right = new TreeNode(v);
55+
p->right->right = p2;
56+
}
57+
}
58+
59+
return root;
60+
}
61+
};

maximum-distance-in-arrays_1_AC.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <algorithm>
2+
#include <functional>
3+
#include <vector>
4+
using std::function;
5+
using std::max;
6+
using std::min;
7+
8+
typedef bool (*FunComp)(const int &, const int &);
9+
10+
class Solution {
11+
public:
12+
int maxDistance(vector<vector<int>>& arrays) {
13+
FunComp lessThan = [](const int &x, const int &y){return x < y;};
14+
15+
int na = arrays.size();
16+
int n;
17+
int i, j;
18+
int min_val, max_val;
19+
20+
vector<int> vmin(na), vmax(na);
21+
for (i = 0; i < na; ++i) {
22+
n = arrays[i].size();
23+
vmin[i] = vmax[i] = arrays[i][0];
24+
for (j = 1; j < n; ++j) {
25+
vmin[i] = min(vmin[i], arrays[i][j]);
26+
vmax[i] = max(vmax[i], arrays[i][j]);
27+
}
28+
}
29+
30+
vector<int> vmin1;
31+
exceptSelf(vmin, vmin1, lessThan);
32+
33+
int res = 0;
34+
for (i = 0; i < na; ++i) {
35+
res = max(res, vmax[i] - vmin1[i]);
36+
}
37+
38+
return res;
39+
}
40+
private:
41+
void exceptSelf(vector<int> &vin, vector<int> &vout, FunComp &cmp) {
42+
int n = vin.size();
43+
if (n < 2) {
44+
vout = vin;
45+
return;
46+
}
47+
48+
vector<int> v1(n), v2(n);
49+
int i;
50+
51+
v1[0] = vin[0];
52+
for (i = 1; i <= n - 1; ++i) {
53+
v1[i] = (cmp(vin[i], v1[i - 1]) ? vin[i] : v1[i - 1]);
54+
}
55+
v2[n - 1] = vin[n - 1];
56+
for (i = n - 2; i >= 0; --i) {
57+
v2[i] = (cmp(vin[i], v2[i + 1]) ? vin[i] : v2[i + 1]);
58+
}
59+
60+
vout.resize(n);
61+
vout[0] = v2[1];
62+
for (i = 1; i < n - 1; ++i) {
63+
vout[i] = (cmp(v1[i - 1], v2[i + 1]) ? v1[i - 1] : v2[i + 1]);
64+
}
65+
vout[n - 1] = v1[n - 2];
66+
}
67+
};

merge-two-binary-trees_1_AC.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// I suppose every node of the new tree should be newly allocated, otherwise things sure can be pretty messed up around here.
2+
/**
3+
* Definition for a binary tree node.
4+
* struct TreeNode {
5+
* int val;
6+
* TreeNode *left;
7+
* TreeNode *right;
8+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
9+
* };
10+
*/
11+
class Solution {
12+
public:
13+
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
14+
TreeNode *root = NULL;
15+
if (t1 == NULL && t2 == NULL) {
16+
return root;
17+
}
18+
19+
int v1 = (t1 != NULL ? t1->val : 0);
20+
int v2 = (t2 != NULL ? t2->val : 0);
21+
root = new TreeNode(v1 + v2);
22+
23+
TreeNode *p1, *p2;
24+
25+
p1 = (t1 != NULL ? t1->left : NULL);
26+
p2 = (t2 != NULL ? t2->left : NULL);
27+
root->left = mergeTrees(p1, p2);
28+
29+
p1 = (t1 != NULL ? t1->right : NULL);
30+
p2 = (t2 != NULL ? t2->right : NULL);
31+
root->right = mergeTrees(p1, p2);
32+
33+
return root;
34+
}
35+
};

minimum-factorization_1_AC.cpp

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Ugly...
2+
#include <algorithm>
3+
#include <climits>
4+
#include <cstdint>
5+
#include <string>
6+
using std::min;
7+
using std::sort;
8+
using std::string;
9+
10+
class Solution {
11+
public:
12+
int smallestFactorization(int a) {
13+
if (a < 0) {
14+
return 0;
15+
}
16+
if (a <= 9) {
17+
return a;
18+
}
19+
20+
const int NP = 4;
21+
const int ND = 10;
22+
int p[NP] = {2, 3, 5, 7};
23+
int c[NP] = {0, 0, 0, 0};
24+
int m[ND][NP] = {
25+
{0, 0, 0, 0},
26+
{0, 0, 0, 0},
27+
{1, 0, 0, 0},
28+
{0, 1, 0, 0},
29+
{2, 0, 0, 0},
30+
{0, 0, 1, 0},
31+
{1, 1, 0, 0},
32+
{0, 0, 0, 1},
33+
{3, 0, 0, 0},
34+
{0, 2, 0, 0}
35+
};
36+
37+
int i;
38+
for (i = 0; i < NP; ++i) {
39+
while (a % p[i] == 0) {
40+
a /= p[i];
41+
++c[i];
42+
}
43+
}
44+
if (a > 1) {
45+
return 0;
46+
}
47+
48+
string s = "";
49+
int n;
50+
int j;
51+
for (i = 9; i >= 2; --i) {
52+
n = INT_MAX;
53+
for (j = 0; j < NP; ++j) {
54+
if (m[i][j] > 0) {
55+
n = min(n, c[j] / m[i][j]);
56+
}
57+
}
58+
if (n == 0) {
59+
continue;
60+
}
61+
for (j = 0; j < n; ++j) {
62+
s.push_back('0' + i);
63+
}
64+
for (j = 0; j < NP; ++j) {
65+
if (m[i][j] > 0) {
66+
c[j] -= n * m[i][j];
67+
}
68+
}
69+
}
70+
sort(s.begin(), s.end());
71+
72+
int64_t res;
73+
sscanf(s.data(), "%lld", &res);
74+
return res <= INT_MAX ? res : 0;
75+
}
76+
};

task-scheduler_1_AC.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include <vector>
2+
using std::vector;
3+
4+
class Solution {
5+
public:
6+
int leastInterval(vector<char>& tasks, int n) {
7+
const int N_DICT = 26;
8+
vector<int> idx(N_DICT, -(n + 1));
9+
vector<int> cnt(N_DICT, 0);
10+
int cc = 0;
11+
12+
int lt = tasks.size();
13+
int i;
14+
for (i = 0; i < lt; ++i) {
15+
++cnt[tasks[i] - 'A'];
16+
++cc;
17+
}
18+
19+
int m = 0;
20+
int mc, mi;
21+
while (cc > 0) {
22+
mc = mi = -1;
23+
for (i = 0; i < N_DICT; ++i) {
24+
if (m - idx[i] <= n || cnt[i] <= 0) {
25+
continue;
26+
}
27+
if (cnt[i] > mc) {
28+
mc = cnt[i];
29+
mi = i;
30+
}
31+
}
32+
if (mi != -1) {
33+
--cnt[mi];
34+
idx[mi] = m;
35+
--cc;
36+
}
37+
++m;
38+
}
39+
40+
return m;
41+
}
42+
};

valid-triangle-number_1_AC.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <algorithm>
2+
#include <vector>
3+
using std::sort;
4+
using std::vector;
5+
6+
class Solution {
7+
public:
8+
int triangleNumber(vector<int>& nums) {
9+
auto &a = nums;
10+
int n = a.size();
11+
12+
sort(a.begin(), a.end());
13+
int i, j, k;
14+
int sum = 0;
15+
16+
i = 0;
17+
while (i < n && a[i] <= 0) {
18+
++i;
19+
}
20+
while (i + 2 < n) {
21+
k = i + 2;
22+
for (j = i + 1; j + 1 < n; ++j) {
23+
while (k < n && a[i] + a[j] > a[k]) {
24+
++k;
25+
}
26+
sum += k - (j + 1);
27+
}
28+
++i;
29+
}
30+
31+
return sum;
32+
}
33+
};

0 commit comments

Comments
 (0)