LeetCode Biweekly Contest 59
总体成绩还行,但是KC爆了!拉胯!
T1: Minimum Time to Type Word Using Special Typewriter
模拟顺时针或者逆时针到目标位置取最小距离相加即可。
T2: Maximum Matrix Sum
结论题:最终只有1个负数或者0个负数,找出绝对值的最小值,其它的和减去这个最小值
T3: Number of Ways to Arrive at Destination
简单的BFS,通过优先队列来计算即可。
T4: Number of Ways to Separate Numbers
F[i,k]表示到第i位,且最后一个数组占用了最多k个长度的结果。 那么为若nums[i-k+1,i]大于等于nums[i-k-k+1,i-k]的话: 那么F[i,k] = F[i,k-1] + F[i-k,k] ,否则为 F[i,k] = F[i,k-1] + F[i-k,k-1] 具体见代码:
class Solution {
private int MOD = 1000000007;
public int numberOfCombinations(String num) {
int n = num.length();
int[][] map = new int[n+1][n+1];
int[] nums = new int[n];
for(int i=0;i<n;i++) {
nums[i] = num.charAt(i) - '0';
}
for(int i=n-1;i>=0;i--) {
for(int j=n-1;j>i;j--) {
if (nums[i] > nums[j]) {
map[i][j] = 0;
}
if (nums[i] == nums[j]) {
map[i][j] = map[i+1][j+1] +1;
}
if (nums[i] < nums[j]) {
map[i][j] = j-i+1;
}
}
}
long[][] fn = new long[n][n+1];
for(int i=0;i<n;i++) {
for (int k = 1; k <= i + 1; k++) {
fn[i][k] = fn[i][k - 1];
if (nums[i - k + 1] == 0) {
continue;
}
if (i - k + 1 == 0) {
fn[i][k] = (fn[i][k] + 1) % MOD;
continue;
}
if ((i - k - k + 1 >= 0) && (map[i - k - k + 1][i - k + 1] >= k)) {
fn[i][k] = (fn[i][k] + fn[i - k][k]) % MOD;
} else {
int t = Math.min(k-1, i-k+1);
fn[i][k] = (fn[i][k] + fn[i - k][t]) % MOD;
}
}
}
return (int)(fn[n-1][n] % MOD);
}
}