0%

2023年5月

[toc]

2023-05-23#

1090. 受标签影响的最大值 - 力扣(Leetcode)

题意没搞清,白搞半小时

搞清题意后其实很简单,先按values大小排序,再从最大处逐个取,如果对应标签数量已经满足阈值就跳过,其实就是用到了排序和哈希而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public int largestValsFromLabels(int[] values, int[] labels, int numWanted, int useLimit) {
Map<Integer, Integer> lableCountMap = new HashMap<>();
Map<Integer, Integer> indexToLableMap = new HashMap<>();
List<Integer> indexs = new ArrayList<>();
for(int i = 0; i < labels.length;i++) {
indexToLableMap.put(i, labels[i]);
indexs.add(i);
lableCountMap.put(labels[i], 0);
}
Collections.sort(indexs, (a,b)->values[b] - values[a]);

List<Integer> res = new ArrayList<>();
for (int index : indexs) {
if (res.size() >= numWanted) {
break;
}
int label = indexToLableMap.get(index);
if (lableCountMap.get(label) >= useLimit) {
continue;
}
lableCountMap.put(label, lableCountMap.get(label) + 1);
res.add(values[index]);
}

return res.stream().mapToInt(Integer::intValue).sum();
}
}

2023-05-22#

1080. 根到叶路径上的不足节点 - 力扣(Leetcode)

树的后序遍历应用题目

不管咋做,反正只要知道后序遍历,后面就都好办。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public TreeNode sufficientSubset(TreeNode root, int limit) {
// 后序遍历
long res = postDfs(root, 0, null, limit);
if (res < limit) {
return null;
} else {
return root;
}
}

long postDfs(TreeNode node, long parentVal, TreeNode parent, int limit) {
// 用于下面的非叶子节点计算,可能会走到这个null
if (node == null) {
return Integer.MIN_VALUE;
}
long sonValMax;
// 叶子节点提前判断一下
if (node.left == null && node.right == null) {
sonValMax = 0;
} else {
// 非叶子节点计算
long leftMaxVal = postDfs(node.left, parentVal + node.val, node, limit);
long rightMaxVal = postDfs(node.right, parentVal + node.val,node, limit);
sonValMax = Math.max(leftMaxVal, rightMaxVal);
}

// 判断自己是否要被删除
if (parent != null && parentVal + sonValMax + node.val < limit) {
if (parent.left == node) {
parent.left = null;
} else {
parent.right = null;
}
}
return sonValMax + node.val;
}
}

2023-05-21#

LCP 33. 蓄水 - 力扣(Leetcode)

这题说是简单题,但是好难,没仔细看条件数量仅有100个桶,而且是一起倒水,水缸没上限

那么可以做枚举,枚举出倒水次数,然后再倒推出每个桶需要增加多少水,即可得到这一次枚举后的总操作数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int storeWater(int[] bucket, int[] vat) {
int res = Integer.MAX_VALUE;

if (Arrays.stream(vat).allMatch(v->v==0)) {
return 0;
}

for (int pushCount = 1; pushCount <=10000; pushCount++) {
int bChangeCount = 0;
for (int i = 0; i < bucket.length;i++) {
int b = bucket[i];
int v = vat[i];
int newB = v / pushCount + (v%pushCount == 0 ? 0 : 1);
int needB = Math.max(newB - b, 0);
bChangeCount += needB;
}
res = Math.min(bChangeCount + pushCount, res);
}
return res;
}
}

改进点:

pushCount的边界条件, 可以是

1
pushCount <=maxv && pushCount < res

核心是<res时, 可以提前退出了