LeetCode第44回隔週コンテスト
質問1:5645。最高高度を見つける
暴力
0から開始し、ゲイン配列に徐々に追加して、最大値(最高高度)を更新して見つけます。
ACコード
class Solution {
public int largestAltitude(int[] g) {
int ans = 0;
int s = 0, len = g.length;
for(int i = 0; i < len; i++) {
ans = Math.max(ans, s);
s += g[i];
}
ans = Math.max(ans, s);
return ans;
}
}
暴力的なシミュレーション
まず、誰が各言語を学んだかを調べ、次に友情を維持するために各言語を教える必要がある人を見つけます(学んだ場合は、もう一度教える必要はありません)。あなたがそれぞれの言語の価値で教える必要がある人々。
注:友情は推移的ではありません
ACコード
class Solution {
public int minimumTeachings(int n, int[][] l, int[][] f) {
// 1 -> 2 3
// 2 -> 1 3
// 3 -> 2 4
Set<Integer>[] set = new HashSet[n + 1];
// 记录学习语言的用户
Set<Integer>[] user = new HashSet[n + 1];
// 初始化
for(int i = 0; i < n + 1; i++) {
set[i] = new HashSet<>();
user[i] = new HashSet<>();
}
// 初始化语言下都有哪些人
for(int i = 0; i < l.length; i++) {
int size = l[i].length;
for(int j = 0; j < size; j++) set[l[i][j]].add((i + 1));
}
int len = f.length;
// 查询朋友关系
for(int i = 0; i < len; i++) {
boolean b = false;
// 遍历 n 种语言
for(int j = 1; j < n + 1; j++) {
// 这两个朋友都学了这种语言
if(set[j].contains(f[i][0]) && set[j].contains(f[i][1])) {
b = true; break;
}
}
if(b) continue ;
// 学习语言
for(int j = 1; j < n + 1; j++) {
if(!set[j].contains(f[i][0])) user[j].add(f[i][0]);
if(!set[j].contains(f[i][1])) user[j].add(f[i][1]);
}
}
int ans = Integer.MAX_VALUE;
for(int i = 1; i < n + 1; i++) {
ans = Math.min(ans, user[i].size());
}
return ans;
}
}
この機能を使用して解決することを考えましたa ^ a = 0、0 ^ b = b
しかし、方向はまだ曲がっています
ソリューション:
- エンコード配列のすべての奇数桁に排他的論理和の結果を与えることにより、先頭以外のn-1個の排他的論理和の結果を得ることができます。
- 次に、sを1からnまでの数値とXORして、すべての超過分をキャンセルし、残りは元のperm配列の先頭にあるものです。
- 最初を見つけてください、残りは解決されます
encoded = [6,5,4,6]
假设 perm[]{
a1, a2, a3, a4, a5}
a1 ^ a2 == 6
a2 ^ a3 == 5
a3 ^ a4 == 4
a4 ^ a5 == 6
我们需要的时候 a2 ^ a3 ^ a4 ^ a5 -> 求出 a1 之后就好解了
a2 ^ a3 ^ a4 ^ a5 == encoded[1] ^ encoded[3]
ACコード
class Solution {
public int[] decode(int[] e) {
int s = 0;
int len = e.length;
// e 数组奇数位的异或起来 等价于 从 perm 数组index = 1 开始异或的结果
for(int i = 1; i < len; i += 2) s ^= e[i];
// 因为 perm 数组是从 1 到 n 的
for(int i = 1; i <= len + 1; i++) s ^= i;
// 此时 sum == perm[0]
// 保存结果
int[] ans = new int[len + 1];
int idx = 0;
ans[idx++] = s;
for(int i = 1; i <= len; i++) {
ans[idx] = ans[idx - 1] ^ e[i - 1];
idx++;
}
return ans;
}
}
4番目の質問:5648。製品配列を生成するためのソリューションの数
追加される
一意の分解+組み合わせの数
ACコード