Leetcode第419周赛 溢出导致第三题GG
第一题
老规矩,第一题直接暴力,截取每一个子数组,然后对子数组的字符存储,然后排序,只能过第一题。本质上这题应该是和滑动窗口有关。
class Solution {
public int[] findXSum(int[] nums, int k, int x) {
int n = nums.length;
int[] result = new int[n - k + 1];
for(int i=0;i<=n-k;i++){
int[] sub = Arrays.copyOfRange(nums, i, i + k);
Map<Integer, Integer> freqMap = new HashMap<>();
for(int num:sub){
freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);
}
List<Map.Entry<Integer, Integer>> freqList = new ArrayList<>(freqMap.entrySet());
freqList.sort((a, b) -> {
if (b.getValue().equals(a.getValue())) {
return b.getKey() - a.getKey();
} else {
return b.getValue() - a.getValue();
}
});
int xSum = 0;
for (int j = 0; j < Math.min(x, freqList.size()); j++) {
xSum += freqList.get(j).getKey() * freqList.get(j).getValue();
}
result[i] = xSum;
}
return result;
}
}
第二题
一个树型DP,采用dfs的方式解决。只需要判断left子树和right子树是否相同,如果相同返回left+right+当前结点,否则返回-1(刚开始写的0,几个样例不能通过,因为左右不同的时候的长度会有当前节点)
class Solution {
Map<TreeNode, Integer> map;
public int kthLargestPerfectSubtree(TreeNode root, int k) {
map = new HashMap<>();
dfs(root);
List<Map.Entry<TreeNode, Integer>> entries = new ArrayList<>(map.entrySet());
// 按值从大到小排序
entries.sort((a, b) -> b.getValue() - a.getValue());
if (k > entries.size()) {
return -1;
}
return entries.get(k - 1).getValue();
}
int dfs(TreeNode node){
if(node==null) return 0;
int left = dfs(node.left);
int right = dfs(node.right);
if(left==right){
int sum = left+right+1;
map.put(node, sum);
return sum;
}
return -1;
}
}
第三题
结束之后发现:不能 res += dfs() %Mod 要 res = res + dfs() %Mod 了 ,溢出最后几十个样例错误,痛失6分
这题实际上就是记忆化搜索,只需要将题目转发一下,就是一个每次选拿个的问题。
class Solution {
int n;
int[][][] memo;
char[] ch;
static final int MOD = 1000000007;
char[] ssc = new char[]{'F','W','E'};
public int countWinningSequences(String s) {
n = s.length();
ch = s.toCharArray();
memo = new int[n][3][2 * n + 1];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k <= 2 * n; k++) {
memo[i][j][k] = -1;
}
}
}
int result = 0;
for (int bobMove = 0; bobMove < 3; bobMove++) {
result = (result + dfs(n - 2, bobMove, getScore(n-1,bobMove))) % MOD;
}
return (int)result;
}
int dfs(int i, int j, int target){
int x = target + n;
if( i < 0) {
return target > 0 ? 1 : 0;
}
if(memo[i][j][x] != -1)return memo[i][j][x];
int result = 0;
for(int z=0;z<3;z++){
if(z==j )continue;
result = (result + dfs(i - 1, z, target + getScore(i,z))) % MOD;
}
memo[i][j][x] = result;
return result % MOD;
}
int getScore(int i, int j) {
char c = ssc[j];
char d = ch[i];
if (d == c) return 0;
if (d == 'F' && c == 'W') return 1;
if (d == 'W' && c == 'E') return 1;
if (d == 'E' && c == 'F') return 1;
return -1;
}
}
第四题
哈哈,三题选手从来不考虑四题的事