Skip to content

Commit 824d1ba

Browse files
committed
weekly contest 317
1 parent adddd88 commit 824d1ba

File tree

3 files changed

+291
-1
lines changed

3 files changed

+291
-1
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7-
7+
* ☀️ [weekly contest 317](src/main/java/weekly/wk317.java) 数组 | hash | 贪心+模拟 | 树形DP
88
* ☀️ [weekly contest 316](src/main/java/weekly/wk316.java) 模拟 | gcd | 前缀和 | 分情况
99
* ☀️ [weekly contest 315](src/main/java/weekly/wk315.java) Hash表 | Hash表 | 暴力 | 双指针
1010
* 🐼 [weekly contest 314](src/main/java/weekly/wk314.java) 数组 | 异或运算 | 贪心+栈 | DP
@@ -34,6 +34,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
3434
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
3535
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
3636

37+
* 🐸 [biweekly contest 90](src/main/java/weekly/wkb90.java) hash | 遍历 | 分组求余 | 单调栈+优先队列
3738
* 🐸 [biweekly contest 89](src/main/java/weekly/wkb89.java) 判断 | 前缀和 | 贪心、二分 | 枚举+DFS
3839
* 🐘 [biweekly contest 88](src/main/java/weekly/wkb88.java) 模拟 | 指针 | 脑筋急转弯 | 线段树
3940
* 🐘 [biweekly contest 87](src/main/java/weekly/wkb87.java) 模拟 | 双指针 | 位运算 | 贪心

src/main/java/weekly/wk317.java

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.HashSet;
6+
import java.util.LinkedList;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Queue;
10+
import java.util.Set;
11+
12+
public class wk317 {
13+
//ranking: 912 / 5660
14+
15+
//直接做
16+
public int averageValue(int[] nums) {
17+
int sum = 0;
18+
int count = 0;
19+
for (int num : nums) {
20+
if (num % 3 == 0 && num % 2 == 0) {
21+
sum += num;
22+
count++;
23+
}
24+
}
25+
if (count == 0) return 0;
26+
return sum / count;
27+
}
28+
29+
//思路简单,做起来麻烦点
30+
public List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
31+
Map<String, Integer> counter = new HashMap<>();
32+
Map<String, List<Integer>> map = new HashMap<>();
33+
for (int i = 0; i < creators.length; i++) {
34+
counter.put(creators[i], counter.getOrDefault(creators[i], 0) + views[i]);
35+
if (!map.containsKey(creators[i])) {
36+
map.put(creators[i], new ArrayList<>());
37+
}
38+
map.get(creators[i]).add(i);
39+
}
40+
int max = 0;
41+
for (Integer value : counter.values()) {
42+
max = Math.max(value, max);
43+
}
44+
List<List<String>> res = new ArrayList<>();
45+
for (Map.Entry<String, Integer> entry : counter.entrySet()) {
46+
if (entry.getValue() == max) {
47+
List<String> ans = new ArrayList<>();
48+
List<Integer> list = map.get(entry.getKey());
49+
list.sort((a, b) -> views[a] != views[b] ? views[b] - views[a] : ids[a].compareTo(ids[b]));
50+
ans.add(entry.getKey());
51+
ans.add(ids[list.get(0)]);
52+
res.add(ans);
53+
}
54+
}
55+
return res;
56+
}
57+
58+
59+
//模拟进位
60+
public long makeIntegerBeautiful(long n, int target) {
61+
if (check(n, target)) return 0;
62+
int pre = 0;//后面的进位
63+
long ans = 0; //加上的数字
64+
long i = 1; //当前位置,个位十位百位..
65+
while (true) {
66+
long cur = (n / i) % 10;//当前位置的数字
67+
long need = 10 - cur - pre; //当前位置需要加的数字
68+
pre = 1;
69+
ans = need * i + ans; //需要加的数字
70+
if (check(n + ans, target)) return ans;
71+
i *= 10;
72+
}
73+
}
74+
75+
76+
boolean check(long n, int target) {
77+
78+
int sum = 0;
79+
while (n > 0) {
80+
sum += n % 10;
81+
n /= 10;
82+
}
83+
return sum <= target;
84+
}
85+
86+
public class TreeNode {
87+
int val;
88+
TreeNode left;
89+
TreeNode right;
90+
91+
TreeNode() {
92+
}
93+
94+
TreeNode(int val) {
95+
this.val = val;
96+
}
97+
98+
TreeNode(int val, TreeNode left, TreeNode right) {
99+
this.val = val;
100+
this.left = left;
101+
this.right = right;
102+
}
103+
}
104+
105+
106+
//树形dp
107+
//先计算每个节点的深度
108+
//然后dfs计算每个节点删除后的树高度,max(右节点的深度+遍历深度,删除父节点的高度)
109+
public int[] treeQueries(TreeNode root, int[] queries) {
110+
dfs(root);
111+
checkMust(root, 0, 0);
112+
for (int i = 0; i < queries.length; i++) {
113+
queries[i] = ans.get(queries[i]);
114+
}
115+
return queries;
116+
}
117+
118+
Map<Integer, int[]> map = new HashMap<>();
119+
120+
int dfs(TreeNode parent) {
121+
if (parent == null) return 0;
122+
int l = dfs(parent.left) + 1;
123+
int r = dfs(parent.right) + 1;
124+
map.put(parent.val, new int[]{Math.max(l, r)});
125+
return Math.max(l, r);
126+
}
127+
128+
Map<Integer, Integer> ans = new HashMap<>();
129+
130+
void checkMust(TreeNode parent, int rest, int up) {
131+
if (parent == null) return;
132+
ans.put(parent.val, rest);
133+
int[] ints = map.getOrDefault(parent.right != null ? parent.right.val : -1, new int[]{0});
134+
checkMust(parent.left, Math.max(rest, ints[0] + up), up + 1);
135+
ints = map.getOrDefault(parent.left != null ? parent.left.val : -1, new int[]{0});
136+
checkMust(parent.right, Math.max(rest, ints[0] + up), up + 1);
137+
}
138+
139+
}

src/main/java/weekly/wkb90.java

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package weekly;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Comparator;
7+
import java.util.Deque;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.PriorityQueue;
12+
import java.util.Stack;
13+
import java.util.TreeMap;
14+
import java.util.TreeSet;
15+
16+
public class wkb90 {
17+
18+
//ranking: 835 / 3624
19+
20+
//改成map也行啊
21+
public String oddString(String[] words) {
22+
23+
String[] diff = new String[words.length];
24+
for (int i = 0; i < words.length; i++) {
25+
String s = "";
26+
for (int j = 1; j < words[i].length(); j++) {
27+
s += words[i].charAt(j) - words[i].charAt(j - 1) + ",";
28+
diff[i] = s;
29+
}
30+
}
31+
32+
for (int i = 0; i < diff.length; i++) {
33+
int c = 0;
34+
for (int j = 0; j < diff.length; j++) {
35+
if (!diff[i].equals(diff[j])) {
36+
c++;
37+
}
38+
}
39+
if (c == diff.length - 1) return words[i];
40+
}
41+
return words[0];
42+
}
43+
44+
45+
//遍历左就好了
46+
public List<String> twoEditWords(String[] queries, String[] dictionary) {
47+
List<String> res = new ArrayList<>();
48+
for (int i = 0; i < queries.length; i++) {
49+
String query = queries[i];
50+
boolean f = false;
51+
for (int j = 0; j < dictionary.length; j++) {
52+
boolean flat = true;
53+
int count = 0;
54+
for (int k = 0; k < query.length(); k++) {
55+
if (query.charAt(k) != dictionary[j].charAt(k)) {
56+
count++;
57+
}
58+
if (count > 2) {
59+
flat = false;
60+
break;
61+
}
62+
}
63+
if (flat) {
64+
f = true;
65+
break;
66+
}
67+
}
68+
if (f) {
69+
res.add(queries[i]);
70+
}
71+
}
72+
return res;
73+
}
74+
75+
public int destroyTargets(int[] nums, int space) {
76+
Map<Integer, Integer> map = new HashMap<>();
77+
Map<Integer, Integer> minMap = new HashMap<>();
78+
for (int i = 0; i < nums.length; i++) {
79+
int sub = nums[i] % space;
80+
map.put(sub, map.getOrDefault(sub, 0) + 1);
81+
minMap.put(sub, Math.min(nums[i], minMap.getOrDefault(sub, Integer.MAX_VALUE)));
82+
}
83+
84+
int ans = 0;
85+
int index = 0;
86+
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
87+
if (entry.getValue() > ans) {
88+
ans = entry.getValue();
89+
index = entry.getKey();
90+
} else if (entry.getValue() == ans && minMap.get(entry.getKey()) < (minMap.get(index))) {
91+
ans = entry.getValue();
92+
index = entry.getKey();
93+
}
94+
}
95+
return minMap.get(index);
96+
97+
}
98+
99+
100+
/* public int[] secondGreaterElement(int[] nums) {
101+
Deque<Integer> deque = new ArrayDeque<>();
102+
int[] ans = new int[nums.length];
103+
Arrays.fill(ans, -1);
104+
Map<Integer, List<Integer>> map = new HashMap<>();
105+
for (int i = 0; i < nums.length; i++) {
106+
List<Integer> list = new ArrayList<>();
107+
while (!deque.isEmpty() && nums[i] > nums[deque.peekLast()]) {
108+
int pre = deque.pollLast();
109+
list.add(pre);
110+
for (Integer prepre : map.get(pre)) {
111+
ans[prepre] = nums[i];
112+
}
113+
}
114+
map.put(i, list);
115+
deque.addLast(i);
116+
}
117+
if (deque.size()>=2) {
118+
Integer head = deque.pollFirst();
119+
Integer next=deque.pollFirst();
120+
for (Integer pre : map.get(head)) {
121+
if(nums[next]>nums[pre]){
122+
ans[pre]=nums[next];
123+
}
124+
}
125+
}
126+
return ans;
127+
}*/
128+
129+
130+
//单调栈+优先队列
131+
//单调递减栈出栈的时候放入优先队列,表示已经有一个数比此数大了
132+
//后续遍历的时候,查看有限队列最小的是不是比这个数要小,如果是这个数就是第二大的数
133+
public int[] secondGreaterElement(int[] nums) {
134+
Deque<Integer> deque = new ArrayDeque<>();
135+
PriorityQueue<Integer> priorityQueue=new PriorityQueue<>((a,b)->nums[a]-nums[b]);
136+
int[] ans = new int[nums.length];
137+
Arrays.fill(ans, -1);
138+
for (int i = 0; i < nums.length; i++) {
139+
while (!priorityQueue.isEmpty()&&nums[i]>priorityQueue.peek()){
140+
ans[priorityQueue.poll()]=nums[i];
141+
}
142+
while (!deque.isEmpty() && nums[i] > nums[deque.peekLast()]) {
143+
priorityQueue.add(deque.pollLast());
144+
}
145+
deque.addLast(i);
146+
}
147+
148+
return ans;
149+
}
150+
}

0 commit comments

Comments
 (0)