Skip to content

Commit b03f54f

Browse files
committed
200118
1 parent 230dd29 commit b03f54f

13 files changed

+627
-6
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// 1.2 O(mnk)/O(mn)
2+
// https://leetcode.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/discuss/453652/Manhattan-distance-instead-of-normal-goal-check
3+
class Solution {
4+
public int shortestPath(int[][] grid, int k) {
5+
final int m = grid.length, n = grid[0].length;
6+
final int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
7+
int[][] dic = new int[m][n];
8+
int res = Integer.MAX_VALUE;
9+
Queue<Integer> qx = new LinkedList<>(), qy = new LinkedList<>(), qk = new LinkedList<>(), qd = new LinkedList<>();
10+
qx.add(0); qy.add(0); qd.add(0); qk.add(k);
11+
while (!qx.isEmpty()) {
12+
int x = qx.poll(), y = qy.poll(), rem = qk.poll(), d = qd.poll();
13+
System.out.println(x + " " + y + " " + rem + " " + d + " ");
14+
if ((m + n - 2 - (x + y)) <= rem)
15+
if (d + m + n - 2 - (x + y) < res)
16+
res = d + m + n - 2 - (x + y);
17+
for (int i = 0; i < dir.length; i++) {
18+
int nx = x + dir[i][0], ny = y + dir[i][1];
19+
if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;
20+
int nk = (grid[nx][ny] == 1 ? rem - 1 : rem), nd = d + 1;
21+
if (nk < 0) continue;
22+
if (dic[nx][ny] < nk) {
23+
dic[nx][ny] = nk;
24+
qx.add(nx); qy.add(ny); qd.add(nd); qk.add(nk);
25+
}
26+
}
27+
}
28+
return (res == Integer.MAX_VALUE ? -1 : res);
29+
}
30+
}
31+
32+
// 1.0
33+
// https://leetcode.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/discuss/451796/Java-Straightforward-BFS-O(MNK)-time-or-O(MNK)-space
34+
class Solution {
35+
public int shortestPath(int[][] grid, int k) {
36+
int step = 0, m = grid.length, n = grid[0].length;
37+
int[][] DIRS = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
38+
int[][] seen = new int[m][n]; // min obstacles elimination from (0,0) to (x, y)
39+
for (int i = 0; i < m; i++) {
40+
Arrays.fill(seen[i], Integer.MAX_VALUE);
41+
}
42+
Queue<int[]> q = new LinkedList<>();
43+
q.offer(new int[]{0, 0, 0});
44+
seen[0][0] = 0;
45+
while (!q.isEmpty()) {
46+
int size = q.size();
47+
while (size-- > 0) {
48+
int[] cur = q.poll();
49+
if (cur[0] == m - 1 && cur[1] == n - 1) {
50+
return step;
51+
}
52+
for (int[] dir : DIRS) {
53+
int x = dir[0] + cur[0];
54+
int y = dir[1] + cur[1];
55+
if (x < 0 || x >= m || y < 0 || y >= n) {
56+
continue;
57+
}
58+
int o = grid[x][y] + cur[2];
59+
if (o >= seen[x][y] || o > k) {
60+
continue;
61+
}
62+
seen[x][y] = o;
63+
q.offer(new int[]{x, y, o});
64+
}
65+
}
66+
++step;
67+
}
68+
return -1;
69+
}
70+
}
71+
72+
// 1.1
73+
class Solution {
74+
public int shortestPath(int[][] grid, int k) {
75+
int step = 0, m = grid.length, n = grid[0].length;
76+
int[][] DIRS = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
77+
int[][] seen = new int[m][n]; // min obstacles elimination from (0,0) to (x, y)
78+
// for (int i = 0; i < m; i++) {
79+
// Arrays.fill(seen[i], Integer.MAX_VALUE);
80+
// }
81+
Queue<int[]> q = new LinkedList<>();
82+
q.offer(new int[]{0, 0, k + 1});
83+
seen[0][0] = 0;
84+
while (!q.isEmpty()) {
85+
int size = q.size();
86+
while (size-- > 0) {
87+
int[] cur = q.poll();
88+
// System.out.println(Arrays.toString(cur));
89+
if (cur[0] == m - 1 && cur[1] == n - 1) {
90+
return step;
91+
}
92+
for (int[] dir : DIRS) {
93+
int x = dir[0] + cur[0];
94+
int y = dir[1] + cur[1];
95+
if (x < 0 || x >= m || y < 0 || y >= n) {
96+
continue;
97+
}
98+
int o = - grid[x][y] + cur[2];
99+
if (o <= seen[x][y] || o < 0) {
100+
continue;
101+
}
102+
seen[x][y] = o;
103+
q.offer(new int[]{x, y, o});
104+
}
105+
}
106+
++step;
107+
}
108+
return -1;
109+
}
110+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public int findNumbers(int[] nums) {
3+
int cnt = 0;
4+
for (int num : nums) {
5+
// System.out.println((Math.log(num) / Math.log(10)) + " " + (int)(Math.log(num) / Math.log(10)) % 2);
6+
if ((int)(Math.log(num + 0.5) / Math.log(10)) % 2 == 1)
7+
cnt++;
8+
}
9+
return cnt;
10+
}
11+
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// 1.0 in-order traversal both trees and add to result list, sort it. O(nlogn)/O(n)
2+
3+
// 2.0 two pointers, like 2-way merge sort, add smaller element to result in each step, and in-order traversal.
4+
// O(n)/O(n)
5+
/**
6+
* Definition for a binary tree node.
7+
* public class TreeNode {
8+
* int val;
9+
* TreeNode left;
10+
* TreeNode right;
11+
* TreeNode(int x) { val = x; }
12+
* }
13+
*/
14+
class Solution {
15+
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
16+
Deque<TreeNode> stack1 = new LinkedList<>(), stack2 = new LinkedList<>();
17+
List<Integer> res = new LinkedList<>();
18+
TreeNode p1 = root1, p2 = root2;
19+
if (p1 != null) {
20+
while (p1.left != null) {
21+
stack1.push(p1);
22+
p1 = p1.left;
23+
}
24+
}
25+
if (p2 != null) {
26+
while (p2.left != null) {
27+
stack2.push(p2);
28+
p2 = p2.left;
29+
}
30+
}
31+
while (p1 != null || p2 != null) {
32+
int temp1 = (p1 == null) ? (int)1e9 : p1.val, temp2 = (p2 == null) ? (int)1e9 : p2.val;
33+
// System.out.println(temp1 + " " + temp2);
34+
// System.out.println(res);
35+
if (temp1 > temp2) {
36+
res.add(p2.val);
37+
if (p2.right != null) {
38+
p2 = p2.right;
39+
while (p2.left != null) {
40+
stack2.push(p2);
41+
p2 = p2.left;
42+
}
43+
} else {
44+
p2 = stack2.isEmpty() ? null : stack2.pop();
45+
}
46+
} else {
47+
res.add(p1.val);
48+
if (p1.right != null) {
49+
p1 = p1.right;
50+
while (p1.left != null) {
51+
stack1.push(p1);
52+
p1 = p1.left;
53+
}
54+
} else {
55+
p1 = stack1.isEmpty() ? null : stack1.pop();
56+
}
57+
}
58+
}
59+
return res;
60+
}
61+
}
62+
63+
// 2.01
64+
class Solution {
65+
private TreeNode getNext(TreeNode p, Deque<TreeNode> s) {
66+
while (p.left != null) {
67+
s.push(p);
68+
p = p.left;
69+
}
70+
return p;
71+
}
72+
73+
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
74+
Deque<TreeNode> stack1 = new LinkedList<>(), stack2 = new LinkedList<>();
75+
List<Integer> res = new LinkedList<>();
76+
TreeNode p1 = root1, p2 = root2;
77+
if (p1 != null) p1 = getNext(p1, stack1);
78+
if (p2 != null) p2 = getNext(p2, stack2);
79+
while (p1 != null || p2 != null) {
80+
int temp1 = (p1 == null) ? (int)1e9 : p1.val, temp2 = (p2 == null) ? (int)1e9 : p2.val;
81+
if (temp1 > temp2) {
82+
res.add(p2.val);
83+
if (p2.right != null) {
84+
p2 = p2.right;
85+
p2 = getNext(p2, stack2);
86+
} else {
87+
p2 = stack2.isEmpty() ? null : stack2.pop();
88+
}
89+
} else {
90+
res.add(p1.val);
91+
if (p1.right != null) {
92+
p1 = p1.right;
93+
p1 = getNext(p1, stack1);
94+
} else {
95+
p1 = stack1.isEmpty() ? null : stack1.pop();
96+
}
97+
}
98+
}
99+
return res;
100+
}
101+
}
102+
103+
//2.02
104+
class Solution {
105+
private TreeNode getNext(TreeNode p, Deque<TreeNode> s) {
106+
while (p.left != null) {
107+
s.push(p);
108+
p = p.left;
109+
}
110+
return p;
111+
}
112+
113+
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
114+
Deque<TreeNode> stack1 = new LinkedList<>(), stack2 = new LinkedList<>();
115+
List<Integer> res = new LinkedList<>();
116+
TreeNode p1 = root1, p2 = root2;
117+
if (p1 != null) p1 = getNext(p1, stack1);
118+
if (p2 != null) p2 = getNext(p2, stack2);
119+
while (p1 != null || p2 != null) {
120+
int temp1 = (p1 == null) ? (int)1e9 : p1.val, temp2 = (p2 == null) ? (int)1e9 : p2.val;
121+
if (temp1 > temp2) {
122+
Deque<TreeNode> tmpStack = stack1; stack1 = stack2; stack2 = tmpStack;
123+
TreeNode tmpp = p1; p1 = p2; p2 = tmpp;
124+
}
125+
res.add(p1.val);
126+
if (p1.right != null) {
127+
p1 = p1.right;
128+
p1 = getNext(p1, stack1);
129+
} else {
130+
p1 = stack1.isEmpty() ? null : stack1.pop();
131+
}
132+
}
133+
return res;
134+
}
135+
}
136+
137+
//2.1
138+
// https://leetcode.com/problems/all-elements-in-two-binary-search-trees/discuss/469952/Java-Inorder-traversal-and-store-to-list

1306_Jump Game III.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// 1.0 bfs, without judge 0 : 0ms, with : 3ms, O(n)/O(n)
2+
class Solution {
3+
public boolean canReach(int[] arr, int start) {
4+
// boolean hasZero = false;
5+
// for (Integer idx : arr) {
6+
// if (idx == 0) {
7+
// hasZero = true;
8+
// break;
9+
// }
10+
// }
11+
// if (!hasZero) return false;
12+
boolean[] visited = new boolean[arr.length];
13+
Queue<Integer> q = new LinkedList<>();
14+
visited[start] = true;
15+
q.add(start);
16+
while (!q.isEmpty()) {
17+
int cur = q.poll();
18+
if (arr[cur] == 0) return true;
19+
int[] next = new int[]{cur + arr[cur], cur - arr[cur]};
20+
for (int idx : next) {
21+
if (idx < arr.length && idx >= 0 && !visited[idx]) {
22+
visited[idx] = true;
23+
q.add(idx);
24+
}
25+
}
26+
}
27+
return false;
28+
}
29+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public String freqAlphabets(String s) {
3+
int p = 0;
4+
StringBuilder res = new StringBuilder();
5+
char[] ch = s.toCharArray();
6+
while (p < s.length()) {
7+
if ((ch[p] == '1' || ch[p] == '2') && (p < s.length() - 2) && (ch[p + 2] == '#')) {
8+
res.append(Character.valueOf((char)('a' + (ch[p] - '0') * 10 + (ch[p + 1] - '0') - 1)));
9+
p += 3;
10+
} else {
11+
res.append(Character.valueOf((char)('a' + ch[p] - '0' - 1)));
12+
p++;
13+
}
14+
}
15+
return res.toString();
16+
}
17+
}

1310_XOR Queries of a Subarray.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// https://leetcode.com/problems/xor-queries-of-a-subarray/discuss/470787/JavaC%2B%2BPython-Straight-Forward-Solution
2+
// https://leetcode.com/problems/xor-queries-of-a-subarray/discuss/474351/pythonc%2B%2Bjava-prefix-xor
3+
class Solution {
4+
public int[] xorQueries(int[] arr, int[][] queries) {
5+
for (int i = 1; i < arr.length; i++) {
6+
arr[i] ^= arr[i - 1];
7+
}
8+
int[] res = new int[queries.length];
9+
for (int i = 0; i < queries.length; i++) {
10+
int[] q = queries[i];
11+
res[i] = q[0] > 0 ? arr[q[1]] ^ arr[q[0] - 1] : arr[q[1]];
12+
}
13+
return res;
14+
}
15+
}
16+
17+
s[i] = a[0] + a[1] .. a[i]
18+
s[i] - s[j] = a[j + 1] + a[j + 2] ... a[i]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// O(n)/O(n)
2+
class Solution {
3+
public int[] decompressRLElist(int[] nums) {
4+
int len = 0, pt = 0;
5+
for (int i = 0; i < nums.length; i += 2) len += nums[i];
6+
int[] res = new int[len];
7+
for (int i = 0; i < nums.length; i += 2) {
8+
for (int j = 0; j < nums[i]; j++) {
9+
res[pt++] = nums[i + 1];
10+
}
11+
}
12+
return res;
13+
}
14+
}
15+
16+
// wrong, can't change orders
17+
class Solution {
18+
public int[] decompressRLElist(int[] nums) {
19+
int[] map = new int[101];
20+
int len = 0, pt = 0;
21+
for (int i = 0; i < nums.length; i += 2) {
22+
map[nums[i + 1]] += nums[i];
23+
len += nums[i];
24+
}
25+
int[] res = new int[len];
26+
for (int i = 1; i <= 100; i++) {
27+
for (int j = 0; j < map[i]; j++) {
28+
res[pt++] = i;
29+
}
30+
}
31+
return res;
32+
}
33+
}

0 commit comments

Comments
 (0)