Skip to content

Commit 7afff06

Browse files
committed
weekly contest 320
1 parent c9286ae commit 7afff06

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
55
leetcode url: <https://leetcode.cn/u/cctest/>
66

77

8+
* ☀️ [weekly contest 320](src/main/java/weekly/wk320.java) 模拟 | DFS | 贪心 | DP
89
* ☀️ [weekly contest 319](src/main/java/weekly/wk319.java) 模拟 | 暴力 | 置换环 | DP
910
* ☀️ [weekly contest 318](src/main/java/weekly/wk318.java) 模拟 | 滑动窗口 | 双指针 | DP
1011
* ☀️ [weekly contest 317](src/main/java/weekly/wk317.java) 数组 | hash | 贪心+模拟 | 树形DP

src/main/java/weekly/wk320.java

+182
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
import java.util.TreeSet;
11+
12+
public class wk320 {
13+
14+
//ranking: 71 / 5678
15+
16+
// a*b*c
17+
public int unequalTriplets(int[] nums) {
18+
Arrays.sort(nums);
19+
int start = 0;
20+
int ans = 0;
21+
for (int i = 0; i < nums.length - 1; i++) {
22+
if (nums[i] != nums[i + 1]) {
23+
ans += start * (i - start + 1) * (nums.length - i - 1);
24+
start = i + 1;
25+
}
26+
}
27+
return ans;
28+
}
29+
30+
/* public int unequalTriplets(int[] nums) {
31+
int res = 0;
32+
for (int i = 0; i < nums.length; i++) {
33+
for (int j = i + 1; j < nums.length; j++) {
34+
for (int k = j + 1; k < nums.length; k++) {
35+
if (nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k]) {
36+
res++;
37+
}
38+
}
39+
}
40+
}
41+
return res;
42+
}*/
43+
44+
45+
// 用treemap做快一点
46+
public class TreeNode {
47+
int val;
48+
TreeNode left;
49+
TreeNode right;
50+
51+
TreeNode() {
52+
}
53+
54+
TreeNode(int val) {
55+
this.val = val;
56+
}
57+
58+
TreeNode(int val, TreeNode left, TreeNode right) {
59+
this.val = val;
60+
this.left = left;
61+
this.right = right;
62+
}
63+
}
64+
65+
TreeSet<Integer> set = new TreeSet<>();
66+
67+
public List<List<Integer>> closestNodes(TreeNode root, List<Integer> queries) {
68+
dfs(root);
69+
List<List<Integer>> res = new ArrayList<>();
70+
for (int i = 0; i < queries.size(); i++) {
71+
List<Integer> l = new ArrayList<>();
72+
Integer floor = set.floor(queries.get(i));
73+
if (floor == null) {
74+
l.add(-1);
75+
} else {
76+
l.add(floor);
77+
}
78+
Integer ceiling = set.ceiling(queries.get(i));
79+
if (ceiling == null) {
80+
l.add(-1);
81+
} else {
82+
l.add(ceiling);
83+
}
84+
res.add(l);
85+
}
86+
return res;
87+
}
88+
89+
void dfs(TreeNode root) {
90+
if (root == null) {
91+
return;
92+
}
93+
set.add(root.val);
94+
dfs(root.left);
95+
dfs(root.right);
96+
}
97+
98+
//贪心 每次把所有乘客都放到离0点更近的节点,一起运送
99+
public long minimumFuelCost(int[][] roads, int seats) {
100+
Map<Integer, List<Integer>> map = new HashMap<>();
101+
for (int[] road : roads) {
102+
if (!map.containsKey(road[0])) map.put(road[0], new ArrayList<>());
103+
if (!map.containsKey(road[1])) map.put(road[1], new ArrayList<>());
104+
map.get(road[0]).add(road[1]);
105+
map.get(road[1]).add(road[0]);
106+
}
107+
dfs(0, -1, seats, map);
108+
return cost;
109+
}
110+
111+
long cost = 0;
112+
113+
int dfs(int cur, int pre, int seats, Map<Integer, List<Integer>> map) {
114+
115+
int count = 0;
116+
for (Integer next : map.getOrDefault(cur, new ArrayList<>())) {
117+
if (next == pre) continue;
118+
int c = dfs(next, cur, seats, map);
119+
cost += c / seats + (c % seats == 0 ? 0 : 1);
120+
count += c;
121+
}
122+
return count + 1;
123+
}
124+
125+
126+
//dp[i][k] 记录截止到i,能分成k段的方法次数
127+
/* static public int beautifulPartitions(String s, int K, int minLength) {
128+
Set<Character> set = new HashSet<>(Arrays.asList('2', '3', '5', '7'));
129+
long[][] dp = new long[s.length() + 1][K + 1];
130+
dp[0][0] = 1;
131+
int mod = (int) 1e9 + 7;
132+
//截止到i
133+
for (int i = 0; i < s.length(); i++) {
134+
//从j开始
135+
for (int j = i - minLength + 1; j >= 0; j--) {
136+
//首尾判断
137+
if (set.contains(s.charAt(j)) && !set.contains(s.charAt(i))) {
138+
for (int k = 1; k <= K; k++) {
139+
dp[i + 1][k] += dp[j][k - 1];
140+
dp[i + 1][k] %= mod;
141+
}
142+
}
143+
}
144+
}
145+
return (int) dp[s.length()][K];
146+
}*/
147+
148+
//优化成二次循环
149+
//dp[k][i] 记录截止到i,能分成k段的方法次数
150+
public int beautifulPartitions(String s, int K, int minLength) {
151+
long[][] dp = new long[s.length() + 1][K + 1];
152+
dp[0][0] = 1;
153+
int mod = (int) 1e9 + 7;
154+
if (K * minLength > s.length() || !isPrime(s.charAt(0)) || isPrime(s.charAt(s.length() - 1))) // 剪枝
155+
return 0;
156+
//分成k段
157+
for (int i = 1; i <= K; i++) {
158+
long sum = 0;
159+
//从j开始
160+
for (int j = i * minLength; j + (K - i) * minLength <= s.length(); j++) {
161+
//求前缀和
162+
//累加前面的分割点,从j-minLength才能累加
163+
if (canPartition(s, j - minLength)) sum = (sum + dp[i - 1][j - minLength]) % mod;
164+
//判断该点能不能分割
165+
if (canPartition(s, j)) dp[i][j] = sum;
166+
}
167+
}
168+
return (int) dp[K][s.length()];
169+
}
170+
171+
private boolean isPrime(char c) {
172+
return c == '2' || c == '3' || c == '5' || c == '7';
173+
}
174+
175+
private boolean canPartition(String s, int j) {
176+
return j == 0 || j == s.length() || !isPrime(s.charAt(j - 1)) && isPrime(s.charAt(j));
177+
}
178+
179+
180+
public static void main(String[] args) {
181+
}
182+
}

0 commit comments

Comments
 (0)