Skip to content

Commit 919b76a

Browse files
committed
weekly contest 363
1 parent e82613d commit 919b76a

File tree

3 files changed

+271
-1
lines changed

3 files changed

+271
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +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-
8+
* 🐼 [weekly contest 363](src/main/java/weekly/wk363.java) 暴力 | 遍历 | 二分 | 质数分解
99
* 🐼 [weekly contest 362](src/main/java/weekly/wk362.java) 差分数组 | 贪心 | 全排列 |
1010
* 🐼 [weekly contest 361](src/main/java/weekly/wk361.java) 枚举 | 枚举 | 前缀和 | 树上倍增+LCA
1111
* 🐼 [weekly contest 360](src/main/java/weekly/wk360.java) 贪心 | 哈希 | 贪心+二进制 | 树上倍增
@@ -74,6 +74,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
7474
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
7575
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
7676

77+
* 🐸 [biweekly contest 113](src/main/java/weekly/wkb113.java) 遍历 | 贪心 | 哈希 | 换根dp
7778
* 🐸 [biweekly contest 112](src/main/java/weekly/wkb112.java) 哈希 | 哈希 | 哈希+滑窗 | 组合数
7879
* 🐸 [biweekly contest 111](src/main/java/weekly/wkb111.java) 遍历 | 贪心+双指针 | 前缀和、dp | 数位dp
7980
* 🐸 [biweekly contest 110](src/main/java/weekly/wkb110.java) 遍历 | 链表 | 哈希 | 排序+dp

src/main/java/weekly/wk363.java

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
public class wk363 {
9+
10+
//暴力
11+
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
12+
int ans = 0;
13+
for (int i = 0; i < nums.size(); i++) {
14+
if (Integer.bitCount(i) == k) {
15+
ans += nums.get(i);
16+
}
17+
}
18+
return ans;
19+
}
20+
21+
22+
//遍历
23+
public int countWays(List<Integer> nums) {
24+
Collections.sort(nums);
25+
26+
int ans = 0;
27+
//判断起始情况
28+
if (nums.get(0) > 0) {
29+
ans++;
30+
}
31+
//依次遍历判断
32+
for (int i = 0; i < nums.size(); i++) {
33+
if (nums.get(i) < i+1) {
34+
//最后的位置不用判断
35+
if (i == nums.size() - 1) {
36+
ans++;
37+
} else {
38+
if (nums.get(i + 1) > i+1) {
39+
ans++;
40+
}
41+
}
42+
}
43+
}
44+
return ans;
45+
46+
}
47+
48+
49+
//二分
50+
public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
51+
int ans = 0;
52+
//遍历制造哪一个
53+
for (List<Integer> list : composition) {
54+
ans = Math.max(help(budget, list, stock, cost), ans);
55+
}
56+
return ans;
57+
}
58+
59+
int help(int budget, List<Integer> composition, List<Integer> stock, List<Integer> cost) {
60+
int left = 0, right = (int) 1e9 + 7;
61+
62+
int b = budget;
63+
while (left < right) {
64+
int mid = (left + right + 1) / 2;
65+
boolean flag = true;
66+
budget = b;
67+
for (int i = 0; i < composition.size(); i++) {
68+
long all = composition.get(i) * (long) mid;
69+
long need = all > stock.get(i) ? all - stock.get(i) : 0;
70+
long c = need * cost.get(i);
71+
72+
if (budget < c) {
73+
flag = false;
74+
break;
75+
}
76+
budget -= c;
77+
}
78+
if (flag) {
79+
left = mid;
80+
} else {
81+
right = mid - 1;
82+
}
83+
}
84+
return left;
85+
}
86+
87+
88+
89+
public long maximumSum(List<Integer> nums) {
90+
long ans = 0;
91+
int n = nums.size();
92+
long[] sum = new long[n + 1];
93+
for (int i = 0; i < nums.size(); i++) {
94+
int c = core(i + 1);
95+
sum[c] += nums.get(i);
96+
ans = Math.max(ans, sum[c]);
97+
}
98+
return ans;
99+
}
100+
101+
//求去除了平方数的值
102+
private int core(int n) {
103+
int res = 1;
104+
for (int i = 2; i * i <= n; i++) {
105+
int e = 0;
106+
while (n % i == 0) {
107+
e ^= 1;
108+
n /= i;
109+
}
110+
if (e == 1) {
111+
res *= i;
112+
}
113+
}
114+
if (n > 1) {
115+
res *= n;
116+
}
117+
return res;
118+
}
119+
120+
public static void main(String[] args) {
121+
wk363 w = new wk363();
122+
List<List<Integer>> list = new ArrayList<>();
123+
list.add(Arrays.asList(10, 10, 1, 5));
124+
list.add(Arrays.asList(10, 10, 1, 5));
125+
126+
w.maxNumberOfAlloys(4, 4, 17, list, Arrays.asList(9, 8, 2, 7), Arrays.asList(9, 2, 6, 10));
127+
}
128+
129+
130+
}

src/main/java/weekly/wkb113.java

+139
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.Arrays;
5+
import java.util.Collections;
6+
import java.util.Comparator;
7+
import java.util.HashMap;
8+
import java.util.HashSet;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.Set;
12+
import java.util.TreeMap;
13+
14+
public class wkb113 {
15+
16+
//找到截断点
17+
public int minimumRightShifts(List<Integer> nums) {
18+
if (nums.size() == 1) return 0;
19+
List<Integer> list = new ArrayList<>();
20+
if (nums.get(0) < nums.get(nums.size() - 1)) {
21+
list.add(0);
22+
}
23+
for (int i = 1; i < nums.size(); i++) {
24+
if (nums.get(i) < nums.get(i - 1)) {
25+
list.add(i);
26+
}
27+
}
28+
if (list.size() > 1) return -1;
29+
30+
return (nums.size() - list.get(0)) % nums.size();
31+
32+
}
33+
34+
//贪心
35+
static public int minLengthAfterRemovals(List<Integer> nums) {
36+
37+
List<Integer> list = new ArrayList<>();
38+
int count = 1;
39+
for (int i = 1; i < nums.size(); i++) {
40+
if (nums.get(i).equals(nums.get(i - 1))) {
41+
count++;
42+
} else {
43+
list.add(count);
44+
count = 1;
45+
}
46+
}
47+
list.add(count);
48+
if (list.size() == 1) return nums.size();
49+
Collections.sort(list, Comparator.reverseOrder());
50+
51+
int max = list.get(0);
52+
int left = 0;
53+
for (Integer integer : list) {
54+
left += integer;
55+
}
56+
left -= max;
57+
return max >= left ? max - left : nums.size() % 2;
58+
}
59+
60+
61+
// 哈希
62+
static public int countPairs(List<List<Integer>> coordinates, int k) {
63+
64+
int ans = 0;
65+
Map<String, Integer> map = new HashMap<>();
66+
for (int i = 0; i < coordinates.size(); i++) {
67+
int x = coordinates.get(i).get(0);
68+
int y = coordinates.get(i).get(1);
69+
for (int j = 0; j <= k; j++) {
70+
int cx = x ^ j;
71+
int cy = y ^ (k - j);
72+
73+
ans += map.getOrDefault(cx + "-" + cy, 0);
74+
}
75+
76+
map.put(x + "-" + y, map.getOrDefault(x + "-" + y, 0) + 1);
77+
}
78+
return ans;
79+
}
80+
81+
82+
//换根dp
83+
public int[] minEdgeReversals(int n, int[][] edges) {
84+
Map<Integer, List<int[]>> map = new HashMap<>();
85+
for (int[] edge : edges) {
86+
if (!map.containsKey(edge[0])) {
87+
map.put(edge[0], new ArrayList<>());
88+
}
89+
if (!map.containsKey(edge[1])) {
90+
map.put(edge[1], new ArrayList<>());
91+
}
92+
map.get(edge[0]).add(new int[]{edge[1], 0});
93+
map.get(edge[1]).add(new int[]{edge[0], 1});
94+
}
95+
96+
//计算正反路径次数
97+
int[] count = dfs(0, -1, map);
98+
99+
int[] ans = new int[n];
100+
//
101+
help(0, -1, map, count, new int[2], ans);
102+
return ans;
103+
}
104+
105+
106+
int[] dfs(int cur, int pre, Map<Integer, List<int[]>> map) {
107+
int[] ans = new int[2];
108+
for (int[] next : map.get(cur)) {
109+
if (next[0] == pre) continue;
110+
ans[next[1]]++;
111+
int[] child = dfs(next[0], cur, map);
112+
ans[0] += child[0];
113+
ans[1] += child[1];
114+
}
115+
return ans;
116+
}
117+
118+
//
119+
120+
void help(int cur, int pre, Map<Integer, List<int[]>> map, int[] count, int[] parent, int[] ans) {
121+
122+
123+
//根节点的反路径-根节点到此的反路径+根节点到此的正路径
124+
ans[cur] = count[1] - parent[1]+parent[0];
125+
126+
for (int[] next : map.get(cur)) {
127+
if (next[0] == pre) continue;
128+
parent[next[1]]++;
129+
help(next[0], cur, map, count, parent,ans);
130+
//回溯
131+
parent[next[1]]--;
132+
}
133+
}
134+
135+
136+
public static void main(String[] args) {
137+
minLengthAfterRemovals(Arrays.asList(1000000000, 1000000000));
138+
}
139+
}

0 commit comments

Comments
 (0)