LeetCode 1787 使所有区间的异或结果为零[动态规划 哈希表] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1787 使所有区间的异或结果为零[动态规划 哈希表] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
一道相对复杂的动态规划题目,在解题前还需要找规律,建立参考官方题解进行理解,代码如下:
class Solution {
private:
// x 的范围为 [0, 2^10)
static constexpr int MAXX = 1 << 10;
// 极大值,为了防止整数溢出选择 INT_MAX / 2
static constexpr int INFTY = INT_MAX / 2;
public:
int minChanges(vector<int>& nums, int k) {
int n = nums.size();
vector<int> f(MAXX, INFTY);
// 边界条件 f(-1,0)=0
f[0] = 0;
for (int i = 0; i < k; ++i) {
// 第 i 个组的哈希映射
unordered_map<int, int> cnt;
int size = 0;
for (int j = i; j < n; j += k) {
++cnt[nums[j]];
++size;
}
// 求出 t2
int t2min = *min_element(f.begin(), f.end());
vector<int> g(MAXX, t2min);
for (int mask = 0; mask < MAXX; ++mask) {
// t1 则需要枚举 x 才能求出
for (auto [x, countx]: cnt) {
g[mask] = min(g[mask], f[mask ^ x] - countx);
}
}
// 别忘了加上 size
for_each(g.begin(), g.end(), [&](int& val) {val += size;});
f = move(g);
}
return f[0];
}
};
以上是关于LeetCode 1787 使所有区间的异或结果为零[动态规划 哈希表] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
1787. 使所有区间的异或结果为零 / 剑指Offer56 - I. 数组中数字出现的次数 / 剑指Offer56 - II. 数组中数字出现的次数 II / 剑指Offer57.和为s的两个数字(