这段代码使用哈希表来求解最小子数组的长度,使得子数组的和对给定值 p 取模后等于给定数组的所有元素和对 p 取模后的余数 k。

代码解释:

  1. 首先计算出数组中所有元素对 p 取模后的余数 k,如果 k 等于 0,说明整个数组对 p 取模后的余数已经为 0,直接返回 0 即可。

  2. 创建一个哈希表 last,用来存储当前子数组对 p 取模后的余数 cur 和它在数组中的下标 i,初始化时将 cur=0 的下标设置为 -1,因为此时子数组为空。

  3. 定义 ans 为数组长度 n,cur 为当前子数组的和对 p 取模后的余数,从 0 开始遍历数组,依次计算 cur 的值。

  4. 对于每个 cur 的值,计算出它与 k 的差值 target,并将 target 对 p 取模后得到的正数作为哈希表 last 的键,如果该键已经存在,说明找到了一个子数组的和对 p 取模后等于 k 的倍数,将 ans 更新为当前子数组长度 i-last[target] 和原来的 ans 中的较小值。

  5. 最后返回 ans,如果 ans 等于数组长度 n,说明不存在符合条件的子数组,返回 -1 即可。

代码示例:

class Solution {
public:
    int minSubarray(vector<int>& nums, int p) {
        int k = 0;
        for (int& x : nums) k = (k + x) % p;
        if (k == 0) return 0;
        unordered_map<int, int> last;
        last[0] = -1;
        int n = nums.size();
        int ans = n;
        int cur = 0;
        for (int i = 0; i < n; ++i) {
            cur = (cur + nums[i]) % p;
            int target = (cur - k + p) % p;
            if (last.count(target)) ans = min(ans, i - last[target]);
            last[cur] = i;
        }
        return ans == n ? -1 : ans;
    }
};

总结:

该代码利用哈希表存储子数组和的模值,有效地减少了时间复杂度,实现了对最小子数组长度的快速求解。该算法在处理大规模数据时能够显著提高效率。

C++ 最小子数组长度求解:哈希表优化算法

原文地址: https://www.cveoy.top/t/topic/mLlc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录