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. 使所有区间的异或结果为零(动态规划)

1787. 使所有区间的异或结果为零 / 剑指Offer56 - I. 数组中数字出现的次数 / 剑指Offer56 - II. 数组中数字出现的次数 II / 剑指Offer57.和为s的两个数字(

使所有区间的异或结果为零需要修改的元素的最少数(DP)

LeetCode﹝异或ி﹞解码异或区间查询第k大异或值

LeetCode﹝异或ி﹞解码异或区间查询第k大异或值

LeetCode﹝异或ி﹞解码异或区间查询第k大异或值