Skip to content

Commit 3f088df

Browse files
committed
weekly contest 335
1 parent ba35ccd commit 3f088df

File tree

3 files changed

+328
-0
lines changed

3 files changed

+328
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
66

77

88

9+
* 🐎️ [weekly contest 335](src/main/java/weekly/wk335.java) 模拟 | 层序遍历 | 质数分解 | 多重背包
910
* 🐎️ [weekly contest 334](src/main/java/weekly/wk334.java) 前缀和 | 取模 | 贪心 | Dijkstra
1011
* 🐎️ [weekly contest 333](src/main/java/weekly/wk333.java)
1112
* 🐎️ [weekly contest 332](src/main/java/weekly/wk332.java) 模拟 | 二分 | 哈希 | 前缀和
@@ -49,6 +50,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
4950
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
5051
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
5152

53+
* 🐸 [biweekly contest 99](src/main/java/weekly/wkb99.java) 贪心 | 递推 | 区间合并 | 换根DP
5254
* 🐸 [biweekly contest 98](src/main/java/weekly/wkb98.java)
5355
* 🐸 [biweekly contest 97](src/main/java/weekly/wkb97.java) 模拟 | 哈希 | 滑动窗口 | DFS
5456
* 🐸 [biweekly contest 92](src/main/java/weekly/wkb93.java) 数组 | 排序 | 贪心 | 贪心

src/main/java/weekly/wk335.java

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.Comparator;
6+
import java.util.HashMap;
7+
import java.util.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.PriorityQueue;
11+
import java.util.Queue;
12+
13+
public class wk335 {
14+
15+
//模拟
16+
public int passThePillow(int n, int time) {
17+
int i = 0;
18+
while (time >= n - 1) {
19+
i++;
20+
time -= (n - 1);
21+
}
22+
int ans = 0;
23+
if (i % 2 == 0) {
24+
ans = time + 1;
25+
} else {
26+
ans = n - time;
27+
}
28+
return ans;
29+
}
30+
31+
public class TreeNode {
32+
int val;
33+
TreeNode left;
34+
TreeNode right;
35+
36+
TreeNode() {
37+
}
38+
39+
TreeNode(int val) {
40+
this.val = val;
41+
}
42+
43+
TreeNode(int val, TreeNode left, TreeNode right) {
44+
this.val = val;
45+
this.left = left;
46+
this.right = right;
47+
}
48+
}
49+
50+
//层序遍历
51+
public long kthLargestLevelSum(TreeNode root, int k) {
52+
Queue<TreeNode> queue = new LinkedList<>();
53+
queue.add(root);
54+
List<Long> list = new ArrayList<>();
55+
while (!queue.isEmpty()) {
56+
int size = queue.size();
57+
long sum = 0;
58+
while (size-- > 0) {
59+
TreeNode cur = queue.poll();
60+
sum += cur.val;
61+
TreeNode left = cur.left;
62+
TreeNode right = cur.right;
63+
if (left != null) {
64+
queue.add(left);
65+
}
66+
if (right != null) {
67+
queue.add(right);
68+
}
69+
}
70+
list.add(sum);
71+
}
72+
Collections.sort(list, Comparator.reverseOrder());
73+
return list.size() < k ? -1 : list.get(k - 1);
74+
}
75+
76+
77+
//质因数分解+统计次数
78+
/* static public int findValidSplit(int[] nums) {
79+
Map<Integer, Integer> counter = new HashMap<>();
80+
List<List<Integer>> list = new ArrayList<>();
81+
for (int i = 0; i < nums.length; i++) {
82+
int num = nums[i];
83+
List<Integer> l = new ArrayList<>();
84+
for (int j = 2; j <= Math.sqrt(nums[i]); j++) {
85+
while (num % j == 0) {
86+
counter.put(j, counter.getOrDefault(j, 0) + 1);
87+
l.add(j);
88+
num /= j;
89+
}
90+
}
91+
if (num > 1) {
92+
int j = num;
93+
counter.put(j, counter.getOrDefault(j, 0) + 1);
94+
l.add(j);
95+
}
96+
list.add(l);
97+
}
98+
int ans = -1;
99+
Map<Integer, Integer> pre = new HashMap<>();
100+
for (int i = 0; i < nums.length - 1; i++) {
101+
List<Integer> l = list.get(i);
102+
for (Integer mul : l) {
103+
Integer count = counter.get(mul);
104+
if (count == 1) {
105+
counter.remove(mul);
106+
} else {
107+
counter.put(mul, count - 1);
108+
}
109+
pre.put(mul, pre.getOrDefault(mul, 0) + 1);
110+
}
111+
boolean flag = true;
112+
for (Integer key : pre.keySet()) {
113+
if (counter.containsKey(key)) {
114+
flag = false;
115+
}
116+
}
117+
if (flag) {
118+
ans = i;
119+
break;
120+
}
121+
}
122+
return ans;
123+
}*/
124+
static public int findValidSplit(int[] nums) {
125+
Map<Integer,Integer> left=new HashMap<>();
126+
int []right=new int[nums.length];
127+
for (int i = 0; i < nums.length; i++) {
128+
int num = nums[i];
129+
for (int j = 2; j <= Math.sqrt(nums[i]); j++) {
130+
if (num % j == 0) {
131+
if(left.containsKey(j)){
132+
right[left.get(j)]=i;//更新质数j出现的最左位置的最右位置
133+
}else {
134+
left.put(j,i);
135+
}
136+
num /= j;
137+
}
138+
while (num%j==0){
139+
num/=j;
140+
}
141+
}
142+
if (num > 1) {
143+
if(left.containsKey(num)){
144+
right[left.get(num)]=i;//更新质数j出现的最左位置的最右位置
145+
}else {
146+
left.put(num,i);
147+
}
148+
}
149+
}
150+
for (int i = 0,maxR=0; i < right.length; i++) {
151+
if(i>maxR){
152+
return maxR;
153+
}
154+
maxR=Math.max(maxR,right[i]);
155+
}
156+
return -1;
157+
}
158+
159+
//多重背包 可压缩成以为
160+
static public int waysToReachTarget(int target, int[][] types) {
161+
int[] dp = new int[target + 1];
162+
int mod = (int) 1e9 + 7;
163+
dp[0] = 1;
164+
for (int[] type : types) {
165+
int count = type[0];
166+
int mark = type[1];
167+
for (int j = dp.length - 1; j >= 0; j--) {
168+
for (int i = 0; i < count; i++) {
169+
if (j - mark >= 0) {
170+
dp[j] += dp[j - mark];
171+
dp[j] %= mod;
172+
}
173+
}
174+
mark += type[1];
175+
}
176+
177+
}
178+
return dp[target];
179+
}
180+
181+
public static void main(String[] args) {
182+
findValidSplit(new int[]{4, 7, 8, 15, 3, 5});
183+
}
184+
}

src/main/java/weekly/wkb99.java

+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Set;
11+
12+
public class wkb99 {
13+
14+
//贪心
15+
public int splitNum(int num) {
16+
17+
List<Integer> list = new ArrayList<>();
18+
List<Integer> l1 = new ArrayList<>();
19+
List<Integer> l2 = new ArrayList<>();
20+
while (num > 0) {
21+
list.add(num % 10);
22+
num /= 10;
23+
}
24+
Collections.sort(list);
25+
for (int i = 0; i < list.size(); i++) {
26+
if (i % 2 == 0) {
27+
l1.add(list.get(i));
28+
} else {
29+
l2.add(list.get(i));
30+
}
31+
}
32+
return sum(l1) + sum(l2);
33+
}
34+
35+
//找规律 递推
36+
public int sum(List<Integer> list) {
37+
int s = 0;
38+
for (Integer i : list) {
39+
s = s * 10 + i;
40+
}
41+
return s;
42+
}
43+
44+
static Map<Integer, Long> map = new HashMap<>();
45+
46+
static {
47+
map.put(1, (long) 1);
48+
long sum = 1;
49+
50+
for (int i = 1; i <= (int) 1e5; i++) {
51+
sum += (long) i * 4;
52+
map.put(i + 1, sum);
53+
}
54+
}
55+
56+
public long coloredCells(int n) {
57+
return map.get(n);
58+
}
59+
60+
61+
62+
//排序,合并区间
63+
public int countWays(int[][] ranges) {
64+
65+
Arrays.sort(ranges, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);
66+
int pre = ranges[0][1];
67+
68+
int count = 1;
69+
for (int i = 1; i < ranges.length; i++) {
70+
if (ranges[i][0] <= pre) {
71+
pre = Math.max(ranges[i][1], pre);
72+
} else {
73+
count++;
74+
pre = ranges[i][1];
75+
}
76+
}
77+
78+
79+
long res = 1;
80+
81+
for (int i = 0; i < count; i++) {
82+
res *= 2;
83+
res %= (int) 1e9 + 7;
84+
}
85+
return (int) res;
86+
87+
}
88+
89+
//两次dfs,也换根DP
90+
public int rootCount(int[][] edges, int[][] guesses, int k) {
91+
Map<Integer, List<Integer>> map = new HashMap<>();
92+
for (int[] edge : edges) {
93+
if (!map.containsKey(edge[0])) map.put(edge[0], new ArrayList<>());
94+
if (!map.containsKey(edge[1])) map.put(edge[1], new ArrayList<>());
95+
map.get(edge[0]).add(edge[1]);
96+
map.get(edge[1]).add(edge[0]);
97+
}
98+
Map<Integer, Set<Integer>> guessMap = new HashMap<>();
99+
for (int[] guess : guesses) {
100+
if (!guessMap.containsKey(guess[0])) guessMap.put(guess[0], new HashSet<>());
101+
guessMap.get(guess[0]).add(guess[1]);
102+
}
103+
104+
int kk = dfs(-1, 0, map, guessMap);
105+
return dfs2(-1, 0, map, guessMap, k, kk);
106+
}
107+
108+
int dfs(int parent, int index, Map<Integer, List<Integer>> map, Map<Integer, Set<Integer>> guessMap) {
109+
int val = 0;
110+
for (Integer child : map.getOrDefault(index, new ArrayList<>())) {
111+
if (child == parent) continue;
112+
if (guessMap.containsKey(index) && guessMap.get(index).contains(child)) {
113+
val++;
114+
}
115+
val += dfs(index, child, map, guessMap);
116+
}
117+
return val;
118+
}
119+
120+
121+
int dfs2(int parent, int index, Map<Integer, List<Integer>> map, Map<Integer, Set<Integer>> guessMap, int k, int kk) {
122+
int res = 0;
123+
//可满足
124+
if (guessMap.containsKey(index) && guessMap.get(index).contains(parent)) {
125+
kk++;
126+
}
127+
if (guessMap.containsKey(parent) && guessMap.get(parent).contains(index)) {
128+
kk--;
129+
}
130+
if (kk >= k) {
131+
res++;
132+
}
133+
134+
for (Integer child : map.getOrDefault(index, new ArrayList<>())) {
135+
if (child == parent) continue;
136+
res += dfs2(index, child, map, guessMap, k, kk);
137+
}
138+
return res;
139+
}
140+
141+
142+
}

0 commit comments

Comments
 (0)