Skip to content

Commit 84aa5b0

Browse files
committed
weekly contest 349
1 parent fe7186c commit 84aa5b0

File tree

3 files changed

+284
-1
lines changed

3 files changed

+284
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
6060
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
6161
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
6262

63-
63+
* 🐸 [biweekly contest 106](src/main/java/weekly/wkb106.java) 模拟 | 滑动窗口 | 排序统计 | 贪心
6464
* 🐸 [biweekly contest 105](src/main/java/weekly/wkb105.java) 模拟 | 记忆化搜索 | 分类讨论 | 并查集
6565
* 🐸 [biweekly contest 102](src/main/java/weekly/wkb102.java) 模拟 | 前缀和 | bfs+dfs | Dijkstra
6666
* 🐸 [biweekly contest 101](src/main/java/weekly/wkb101.java) 哈希 | 滑动窗口 | 并查集 | BFS

src/main/java/weekly/wk349.java

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.Map;
5+
import java.util.TreeMap;
6+
7+
public class wk349 {
8+
//模拟
9+
public int findNonMinOrMax(int[] nums) {
10+
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
11+
for (int num : nums) {
12+
min = Math.min(min, num);
13+
max = Math.max(max, num);
14+
}
15+
for (int num : nums) {
16+
if (num != min && num != max) {
17+
return num;
18+
}
19+
}
20+
return -1;
21+
}
22+
23+
public String smallestString(String s) {
24+
char[] chars = s.toCharArray();
25+
int index = s.length();
26+
//找到第一个不等于a的
27+
for (int i = 0; i < s.length(); i++) {
28+
if (s.charAt(i) != 'a') {
29+
index = i;
30+
break;
31+
}
32+
}
33+
//若都是a,则也要替换一个
34+
if (index == s.length()) {
35+
chars[s.length() - 1] = 'z';
36+
return new String(chars);
37+
}
38+
//碰到a就返回
39+
for (int i = index; i < s.length(); i++) {
40+
if (chars[i] == 'a') {
41+
break;
42+
} else {
43+
chars[i] = (char) (chars[i] - 1);
44+
}
45+
}
46+
return new String(chars);
47+
}
48+
49+
50+
//动态规划,考虑旋转n次
51+
public long minCost(int[] nums, int x) {
52+
//一次不转
53+
long ans = 0;
54+
for (int num : nums) {
55+
ans += num;
56+
}
57+
58+
int[] dp = new int[nums.length];
59+
//一次不转就是原来的价格
60+
for (int i = 0; i < nums.length; i++) {
61+
dp[i] = nums[i];
62+
}
63+
//转d次
64+
for (int d = 1; d < nums.length; d++) {
65+
long temp = (long) d * x;
66+
for (int i = 0; i < nums.length; i++) {
67+
//比较最小的一次替换
68+
dp[i] = Math.min(nums[(i + d) % nums.length], dp[i]);
69+
temp += dp[i];
70+
}
71+
ans = Math.min(temp, ans);
72+
}
73+
return ans;
74+
}
75+
76+
77+
static public int[] maximumSumQueries(int[] nums1, int[] nums2, int[][] queries) {
78+
int[][] comp = new int[nums1.length][4];
79+
for (int i = 0; i < nums1.length; i++) {
80+
comp[i] = new int[]{nums1[i], nums2[i]};
81+
}
82+
Arrays.sort(comp, (a, b) -> a[0] - b[0]);
83+
84+
85+
int[][] qq = new int[queries.length][3];
86+
for (int i = 0; i < queries.length; i++) {
87+
qq[i] = new int[]{queries[i][0], queries[i][1], i};
88+
}
89+
Arrays.sort(qq, (a, b) -> b[0] - a[0]);
90+
int[] ans = new int[queries.length];
91+
int q = 0;
92+
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
93+
for (int i = comp.length - 1; i >= 0; i--) {
94+
//查询的num1比这个要大,说明当前已不满足条件
95+
while (q < queries.length && qq[q][0] > comp[i][0]) {
96+
Map.Entry<Integer, Integer> entry = treeMap.ceilingEntry(qq[q][1]);
97+
if (entry == null) {
98+
ans[qq[q][2]] = -1;
99+
} else {
100+
ans[qq[q][2]] = entry.getValue();
101+
}
102+
q++;
103+
}
104+
105+
106+
int num2 = comp[i][1];
107+
int max = num2 + comp[i][0];
108+
109+
//找一个比num2大的,继承其最大值
110+
Map.Entry<Integer, Integer> up = treeMap.ceilingEntry(num2);
111+
if (up != null) {
112+
max = Math.max(up.getValue(), max);
113+
}
114+
115+
//将比num2小的且和没有num2的大的都删除掉,即表示num2可以代表这些数了
116+
while (treeMap.floorEntry(num2) != null && treeMap.floorEntry(num2).getValue() <= max) {
117+
treeMap.remove(treeMap.floorKey(num2));
118+
}
119+
treeMap.put(num2, max);
120+
}
121+
122+
while (q < queries.length) {
123+
Map.Entry<Integer, Integer> entry = treeMap.ceilingEntry(qq[q][1]);
124+
if (entry == null) {
125+
ans[qq[q][2]] = -1;
126+
} else {
127+
ans[qq[q][2]] = entry.getValue();
128+
}
129+
q++;
130+
}
131+
return ans;
132+
}
133+
134+
public static void main(String[] args) {
135+
maximumSumQueries(new int[]{4, 3, 1, 2}, new int[]{2, 4, 9, 5}, new int[][]{
136+
{4, 1}, {1, 3}, {2, 5}
137+
});
138+
}
139+
}

src/main/java/weekly/wkb106.java

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
public class wkb106 {
10+
//模拟
11+
public boolean isFascinating(int n) {
12+
int[] count = new int[10];
13+
for (int i = 1; i <= 3; i++) {
14+
String num = new String((n * i) + "");
15+
for (char c : num.toCharArray()) {
16+
count[c - '0']++;
17+
}
18+
}
19+
20+
if (count[0] > 0) return false;
21+
for (int i = 1; i < count.length; i++) {
22+
if (count[i] != 1) return false;
23+
}
24+
return true;
25+
}
26+
/*
27+
public int longestSemiRepetitiveSubstring(String s) {
28+
char[] chars = s.toCharArray();
29+
List<Integer> list = new ArrayList<>();
30+
list.add(-1);
31+
for (int i = 0; i < chars.length - 1; i++) {
32+
if (chars[i] == chars[i + 1]) {
33+
list.add(i);
34+
}
35+
}
36+
list.add(s.length());
37+
for (Integer integer : list) {
38+
System.out.println(integer);
39+
}
40+
int ans = 0;
41+
if (list.size() == 2) {
42+
ans = s.length();
43+
}
44+
for (int i = 1; i < list.size() - 1; i++) {
45+
ans = Math.max(ans, list.get(i + 1) - list.get(i - 1) + 1);
46+
}
47+
return ans;
48+
}*/
49+
50+
//暴力
51+
/* public int longestSemiRepetitiveSubstring(String s) {
52+
int ans = 0;
53+
for (int i = 0; i < s.length(); i++) {
54+
for (int j = i; j < s.length(); j++) {
55+
int count = 0;
56+
for (int k = i + 1; k <= j; k++) {
57+
if (s.charAt(k) == s.charAt(k - 1)) {
58+
count++;
59+
}
60+
}
61+
if (count <= 1) {
62+
ans = Math.max(ans, j - i + 1);
63+
}
64+
}
65+
}
66+
return ans;
67+
}*/
68+
//滑动窗口
69+
static public int longestSemiRepetitiveSubstring(String s) {
70+
char[] chars = s.toCharArray();
71+
int left = 0;
72+
int same = 0;
73+
int ans = 0;
74+
for (int right = 1; right < chars.length; right++) {
75+
if (chars[right] == chars[right - 1]) {
76+
same++;
77+
if (same > 1) {
78+
for (left++; chars[left] != chars[left - 1]; left++) {
79+
same = 1;
80+
}
81+
}
82+
}
83+
ans = Math.max(ans, right - left + 1);
84+
}
85+
return ans;
86+
}
87+
88+
89+
//不管有没有碰撞,都是走d距离
90+
public int sumDistance(int[] nums, String s, int d) {
91+
int mod = (int) 1e9 + 7;
92+
long[] distance = new long[nums.length];
93+
for (int i = 0; i < nums.length; i++) {
94+
if (s.charAt(i) == 'R') {
95+
distance[i] = (long) nums[i] + d;
96+
} else {
97+
distance[i] = (long) nums[i] - d;
98+
}
99+
}
100+
// for (int i = 0; i < nums.length; i++) {
101+
// System.out.println(nums[i]);
102+
// }
103+
Arrays.sort(distance);
104+
105+
long sum = 0;
106+
for (int i = 1; i < nums.length; i++) {
107+
sum += distance[i] - distance[0];
108+
}
109+
long ans = 0;
110+
ans += sum;
111+
ans %= mod;
112+
for (int i = 1; i < nums.length; i++) {
113+
long dis = distance[i] - distance[i - 1];
114+
sum -= (dis * (nums.length - i));
115+
ans += sum;
116+
ans %= mod;
117+
}
118+
return (int) ans;
119+
}
120+
121+
122+
//脑筋急转弯
123+
public List<Integer> goodSubsetofBinaryMatrix(int[][] grid) {
124+
Map<Integer, Integer> idx = new HashMap<>();
125+
for (int i = 0; i < grid.length; i++) {
126+
int mask = 0;
127+
for (int j = 0; j < grid[i].length; j++)
128+
mask |= grid[i][j] << j;
129+
idx.put(mask, i);
130+
}
131+
if (idx.containsKey(0)) {
132+
return Arrays.asList(idx.get(0));
133+
}
134+
for (Map.Entry<Integer, Integer> e1 : idx.entrySet()) {
135+
for (Map.Entry<Integer, Integer> e2 : idx.entrySet()) {
136+
if ((e1.getKey() & e2.getKey()) == 0) {
137+
int i = e1.getValue(), j = e2.getValue();
138+
return i < j ? Arrays.asList(i, j) : Arrays.asList(j, i);
139+
}
140+
}
141+
}
142+
return new ArrayList<>();
143+
}
144+
}

0 commit comments

Comments
 (0)