Skip to content

Commit 1b11c3d

Browse files
committed
weekly contest 359
1 parent 68ece56 commit 1b11c3d

File tree

3 files changed

+238
-0
lines changed

3 files changed

+238
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +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+
* 🐼 [weekly contest 359](src/main/java/weekly/wk359.java) 模拟 | 贪心 | 分组+dp | 分组+双指针
78
* 🐼 [weekly contest 358](src/main/java/weekly/wk358.java) 模拟 | 链表 | 滑动窗口 | 质数分解+单调栈+快速幂
89
* 🐼 [weekly contest 357](src/main/java/weekly/wk357.java) 模拟 | 贪心 | 并查集、Dijkstra | 贪心
910
* 🐼 [weekly contest 356](src/main/java/weekly/wk356.java) 遍历 | 滑动窗口 | 枚举 | 数位dp
@@ -69,6 +70,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
6970
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
7071

7172

73+
* 🐸 [biweekly contest 111](src/main/java/weekly/wkb111.java) 遍历 | 贪心+双指针 | 前缀和、dp | 数位dp
7274
* 🐸 [biweekly contest 110](src/main/java/weekly/wkb110.java) 遍历 | 链表 | 哈希 | 排序+dp
7375
* 🐸 [biweekly contest 109](src/main/java/weekly/wkb109.java) 模拟 | 模拟 | dp | 01背包/记忆化搜索
7476
* 🐸 [biweekly contest 108](src/main/java/weekly/wkb108.java) 模拟 | 哈希 | dp | 枚举

src/main/java/weekly/wk359.java

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package weekly;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.Deque;
8+
import java.util.HashMap;
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Set;
13+
import java.util.TreeMap;
14+
15+
public class wk359 {
16+
//模拟
17+
public boolean isAcronym(List<String> words, String s) {
18+
if (words.size() != s.length()) return false;
19+
for (int i = 0; i < words.size(); i++) {
20+
if (words.get(i).charAt(0) != s.charAt(i)) {
21+
return false;
22+
}
23+
}
24+
return true;
25+
}
26+
27+
//贪心
28+
public int minimumSum(int n, int k) {
29+
Set<Integer> set = new HashSet<>();
30+
31+
int num = 1;
32+
int sum = 0;
33+
for (int i = 0; i < n; i++) {
34+
while (set.contains(k - num)) {
35+
num++;
36+
}
37+
set.add(num);
38+
sum += num;
39+
num++;
40+
}
41+
42+
return sum;
43+
}
44+
45+
46+
// n*logn
47+
// 堆
48+
/* public int maximizeTheProfit(int n, List<List<Integer>> offers) {
49+
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
50+
Collections.sort(offers, (a, b) -> a.get(1) - b.get(1));
51+
52+
int ans = 0;
53+
for (List<Integer> offer : offers) {
54+
int start = offer.get(0);
55+
int end = offer.get(1);
56+
int gold = offer.get(2);
57+
Map.Entry<Integer, Integer> pre = treeMap.floorEntry(start - 1);
58+
Map.Entry<Integer, Integer> entry = treeMap.floorEntry(end);
59+
int val = Math.max((pre == null ? 0 : pre.getValue()) + gold, entry == null ? 0 : entry.getValue());
60+
treeMap.put(end, val);
61+
ans = Math.max(ans, val);
62+
}
63+
64+
return ans;
65+
}*/
66+
67+
//分组+dp
68+
public int maximizeTheProfit(int n, List<List<Integer>> offers) {
69+
ArrayList<int[]>[] groups = new ArrayList[n];
70+
Arrays.setAll(groups, e -> new ArrayList<>());
71+
for (List<Integer> offer : offers) {
72+
groups[offer.get(1)].add(new int[]{offer.get(0), offer.get(2)});
73+
}
74+
int[] dp = new int[n + 1];
75+
76+
for (int end = 0; end <= n; end++) {
77+
dp[end + 1] = dp[end];
78+
for (int[] ints : groups[end]) {
79+
dp[end + 1] = Math.max(dp[end + 1], dp[ints[0]] + ints[1]);
80+
}
81+
}
82+
83+
return dp[n];
84+
}
85+
86+
87+
// n* log n
88+
//分组+双指针
89+
public int longestEqualSubarray(List<Integer> nums, int k) {
90+
Map<Integer, Deque<Integer>> map = new HashMap<>();
91+
92+
int ans = 1;
93+
for (int i = 0; i < nums.size(); i++) {
94+
int num = nums.get(i);
95+
if (!map.containsKey(num)) {
96+
map.put(num, new ArrayDeque<>());
97+
map.get(num).addLast(i);
98+
} else {
99+
Deque<Integer> list = map.get(num);
100+
list.addLast(i);
101+
int count = list.size();
102+
while (i - list.peekFirst() + 1 - count > k) {
103+
list.pollFirst();
104+
count--;
105+
}
106+
ans = Math.max(ans, list.size());
107+
}
108+
}
109+
return ans;
110+
}
111+
112+
113+
}

src/main/java/weekly/wkb111.java

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
public class wkb111 {
8+
//遍历
9+
public int countPairs(List<Integer> nums, int target) {
10+
int ans = 0;
11+
for (int i = 0; i < nums.size(); i++) {
12+
for (int j = i + 1; j < nums.size(); j++) {
13+
if (nums.get(i) + nums.get(j) < target) {
14+
ans++;
15+
}
16+
}
17+
}
18+
return ans;
19+
}
20+
21+
//贪心+双指针
22+
public boolean canMakeSubsequence(String str1, String str2) {
23+
int index = 0;
24+
for (int i = 0; i < str1.length() && index < str2.length(); i++) {
25+
char c = str1.charAt(i);
26+
if (c == str2.charAt(index)) {
27+
index++;
28+
} else if (c == 'z' && str2.charAt(index) == 'a') {
29+
index++;
30+
} else if ((char) (c + 1) == str2.charAt(index)) {
31+
index++;
32+
}
33+
}
34+
return index >= str2.length();
35+
}
36+
37+
//前缀和或dp
38+
public int minimumOperations(List<Integer> nums) {
39+
int[][] count = new int[nums.size() + 1][3];
40+
for (int i = 0; i < nums.size(); i++) {
41+
count[i + 1] = new int[]{
42+
count[i][0], count[i][1], count[i][2]
43+
};
44+
if (nums.get(i) == 1) {
45+
count[i + 1][0]++;
46+
} else if (nums.get(i) == 2) {
47+
count[i + 1][1]++;
48+
} else if (nums.get(i) == 3) {
49+
count[i + 1][2]++;
50+
}
51+
}
52+
53+
int ans = Math.min(nums.size() - count[nums.size()][0], Math.min(nums.size() - count[nums.size()][1], nums.size() - count[nums.size()][2]));
54+
for (int i = 0; i <= nums.size(); i++) {
55+
for (int j = i; j <= nums.size(); j++) {
56+
int one = i - count[i][0];
57+
int two = (j - i) - (count[j][1] - count[i][1]);
58+
int three = (nums.size() - j) - (count[nums.size()][2] - count[j][2]);
59+
ans = Math.min(ans, one + two + three);
60+
}
61+
}
62+
63+
return ans;
64+
}
65+
66+
67+
//数位dp
68+
public int numberOfBeautifulIntegers(int low, int high, int k) {
69+
this.k = k;
70+
return countSpecialNumbers(high) - countSpecialNumbers(low-1) ;
71+
}
72+
73+
//数位dp通用模板
74+
75+
char s[];
76+
int dp[][][];
77+
int k;
78+
79+
public int countSpecialNumbers(int n) {
80+
s = Integer.toString(n).toCharArray();
81+
int m = s.length;
82+
dp = new int[m][100][21];
83+
for (int i = 0; i < m; i++)
84+
for (int j = 0; j < dp[0].length; j++) {
85+
Arrays.fill(dp[i][j], -1);
86+
}
87+
return f(0, 0, 0, true, false);
88+
}
89+
90+
//i表示当前位置,mask 奇数和偶数的数目,islimit表示是否限制最大到9,isNum表示之前是否有数字
91+
int f(int i, int mask, int mod, boolean isLimit, boolean isNum) {
92+
if (i == s.length) {
93+
boolean b = isNum && mod == 0 && (mask / 10) == (mask % 10);
94+
if (b) {
95+
return 1;
96+
} else {
97+
return 0;
98+
}
99+
}
100+
if (!isLimit && isNum && dp[i][mask][mod] >= 0) return dp[i][mask][mod];
101+
int res = 0;
102+
if (!isNum) res = f(i + 1, mask,mod, false, false); // 可以跳过当前数位
103+
for (int d = isNum ? 0 : 1, up = isLimit ? s[i] - '0' : 9; d <= up; ++d) { // 枚举要填入的数字 d
104+
int add = 0;
105+
if (d % 2 == 0) {
106+
add = 10;
107+
} else {
108+
add = 1;
109+
}
110+
111+
res += f(i + 1, mask + add, (mod * 10 + d)%k,isLimit && d == up, true);
112+
}
113+
if (!isLimit && isNum) dp[i][mask][mod] = res;
114+
return res;
115+
}
116+
117+
118+
public static void main(String[] args) {
119+
wkb111 w = new wkb111();
120+
System.out.println(w.numberOfBeautifulIntegers(0, 72, 16));
121+
}
122+
123+
}

0 commit comments

Comments
 (0)