Skip to content

Commit fe7186c

Browse files
committed
weekly contest 348
1 parent a966671 commit fe7186c

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7+
8+
* ☀️ [weekly contest 348](src/main/java/weekly/wk348.java) 哈希 | 分类讨论 | 逆向 | 数位DP
79
* ☀️ [weekly contest 346](src/main/java/weekly/wk346.java) 栈 | 遍历 | 回溯 | Dijkstra
810
* ☀️ [weekly contest 345](src/main/java/weekly/wk345.java) 模拟 | 异或 | dp | 并查集
911
* ☀️ [weekly contest 344](src/main/java/weekly/wk344.java) 前缀和 | 哈希 | 模拟 | 树形dp

src/main/java/weekly/wk348.java

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
7+
public class wk348 {
8+
9+
10+
//哈希
11+
public int minimizedStringLength(String s) {
12+
Set<Character> set = new HashSet<>();
13+
for (int i = 0; i < s.length(); i++) {
14+
set.add(s.charAt(i));
15+
}
16+
return set.size();
17+
}
18+
19+
20+
//分类讨论吧
21+
public int semiOrderedPermutation(int[] nums) {
22+
int min = 0, max = 0;
23+
for (int i = 0; i < nums.length; i++) {
24+
if (nums[i] == 1) {
25+
min = i;
26+
} else if (nums[i] == nums.length) {
27+
max = i;
28+
}
29+
}
30+
int ans = min - 1 + nums.length - max;
31+
if (max < min) {
32+
ans--;
33+
}
34+
return ans;
35+
}
36+
37+
38+
//逆着遍历,然后乘法快速计算
39+
static public long matrixSumQueries(int n, int[][] queries) {
40+
long ans = 0;
41+
42+
Set<Integer> row = new HashSet<>();
43+
Set<Integer> col = new HashSet<>();
44+
for (int i = queries.length - 1; i >= 0; i--) {
45+
int[] query = queries[i];
46+
if (query[0] == 0) {
47+
if (row.contains(query[1])) continue;
48+
ans += ((long) n - col.size()) * (long) query[2];
49+
row.add(query[1]);
50+
} else {
51+
if (col.contains(query[1])) continue;
52+
ans += ((long) n - row.size()) * (long) query[2];
53+
col.add(query[1]);
54+
}
55+
}
56+
57+
return ans;
58+
}
59+
60+
61+
//数位dp
62+
int mod=(int)1e9+7;
63+
public int count(String num1, String num2, int minSum, int maxSum) {
64+
int ans = count(num2,maxSum,minSum) - count(num1,maxSum,minSum) + mod; // 避免负数
65+
int sum = 0;
66+
for (char c : num1.toCharArray()) sum += c - '0';
67+
if (minSum <= sum && sum <= maxSum) ans++; // x=num1 是合法的,补回来
68+
return ans % mod;
69+
}
70+
71+
private int count(String S, int maxSum,int minSum) {
72+
char[] s = S.toCharArray();
73+
int n = s.length;
74+
int [][] memo = new int[n][Math.min(9 * n, maxSum) + 1];
75+
for (int i = 0; i < n; i++)
76+
Arrays.fill(memo[i], -1); // -1 表示没有计算过
77+
return f(s, memo, 0, 0, true,maxSum,minSum);
78+
}
79+
80+
private int f(char[] s, int[][] memo, int i, int sum, boolean isLimit, int maxSum,int minSum) {
81+
if (sum > maxSum) return 0;
82+
if (i >= s.length) return sum>=minSum?1:0;
83+
if (isLimit && memo[i][sum] != -1) return memo[i][sum];
84+
85+
int up = isLimit ? s[i] - '0' : 9;
86+
int res=0;
87+
for (int u = 0; u <= up; u++) {
88+
res+=f(s,memo,i+1,sum+u,isLimit&&u==up,maxSum,minSum);
89+
res%=mod;
90+
}
91+
if(!isLimit) memo[i][sum]=res;
92+
return res;
93+
}
94+
95+
public static void main(String[] args) {
96+
97+
}
98+
99+
100+
}

0 commit comments

Comments
 (0)