【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表

简介: 【每日一题Day142】LC1590使数组和能被 P 整除 | 前缀和+哈希表

使数组和能被 P 整除【LC1590】

给你一个正整数数组 nums,请你移除 最短 子数组(可以为 ),使得剩余元素的 能被 p 整除。 不允许 将整个数组都移除。

请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1

子数组 定义为原数组中连续的一组元素。

这种只差一点的感觉 真难受

  • 思路

image.png

  • 因此我们可以将前缀和放入哈希表中,哈希表存放前缀和及其对应的下标,然后对于每个right,查找是否有符合的left,有则更新最小长度
  • 实现
    为了防止越界,前缀和数组记录对p取余的结果
class Solution {
    public int minSubarray(int[] nums, int p) {
        int n = nums.length, ans = n;
        var s = new int[n + 1];
        for (int i = 0; i < n; ++i)
            s[i + 1] = (s[i] + nums[i]) % p;
        int x = s[n];
        if (x == 0) return 0; // 移除空子数组(这行可以不要)
        var last = new HashMap<Integer, Integer>();
        for (int i = 0; i <= n; ++i) {
            last.put(s[i], i);
            // 如果不存在,-n 可以保证 i-j >= n
            int j = last.getOrDefault((s[i] - x + p) % p, -n);
            ans = Math.min(ans, i - j);
        }
        return ans < n ? ans : -1;
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/make-sum-divisible-by-p/solutions/2158435/tao-lu-qian-zhui-he-ha-xi-biao-pythonjav-rzl0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


image.png

目录
相关文章
|
5月前
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
【每日一题Day205】LC2441与对应负数同时存在的最大正整数 | 哈希表
42 1
|
5月前
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
【每日一题Day370】LC318最大单词长度乘积 | 哈希表 位运算
49 1
|
5月前
|
存储
【每日一题Day158】LC2395和相等的子数组 | 哈希表
【每日一题Day158】LC2395和相等的子数组 | 哈希表
29 0
|
5月前
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
42 0
|
5月前
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
26 0
|
5月前
|
机器学习/深度学习
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
35 0
|
5月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
28 0
|
5月前
【每日一题Day252】LC1两数之和 | 哈希表
【每日一题Day252】LC1两数之和 | 哈希表
33 0
|
5月前
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
38 0
|
5月前
|
API 索引
【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表
【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表
46 0