C++ 最小子数组长度求解:哈希表优化算法
这段代码使用哈希表来求解最小子数组的长度,使得子数组的和对给定值 p 取模后等于给定数组的所有元素和对 p 取模后的余数 k。
代码解释:
-
首先计算出数组中所有元素对 p 取模后的余数 k,如果 k 等于 0,说明整个数组对 p 取模后的余数已经为 0,直接返回 0 即可。
-
创建一个哈希表 last,用来存储当前子数组对 p 取模后的余数 cur 和它在数组中的下标 i,初始化时将 cur=0 的下标设置为 -1,因为此时子数组为空。
-
定义 ans 为数组长度 n,cur 为当前子数组的和对 p 取模后的余数,从 0 开始遍历数组,依次计算 cur 的值。
-
对于每个 cur 的值,计算出它与 k 的差值 target,并将 target 对 p 取模后得到的正数作为哈希表 last 的键,如果该键已经存在,说明找到了一个子数组的和对 p 取模后等于 k 的倍数,将 ans 更新为当前子数组长度 i-last[target] 和原来的 ans 中的较小值。
-
最后返回 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;
}
};
总结:
该代码利用哈希表存储子数组和的模值,有效地减少了时间复杂度,实现了对最小子数组长度的快速求解。该算法在处理大规模数据时能够显著提高效率。
原文地址: https://www.cveoy.top/t/topic/mLlc 著作权归作者所有。请勿转载和采集!