leetcode 1590

1590: 使数组和能被P整除

  • 子数组和问题,考虑前缀和

思路:设 nums 的元素和为 x,去掉的子数组和为 y。x−y 能被 p 整除,根据前置知识中同余的定义,这等价于 y≡x(modp);

创建 nums 的前缀和数组 s,方便计算子数组和 y。

遍历 si 的同时,用哈希表 last ++记录 simodp 最近一次出现的下标++,如果 last 中包含 (simodp−xmodp+p)modp,设其对应的下标为 j,那么 [j,i) 是一个符合题目要求的子数组,用其长度 i−j 更新答案的最小值。如果没有符合要求的子数组,返回 −1。

复制代码
int x=reduce(nums.begin(),nums.end(),0LL)%p;

INT_MAX约为(2.1 × 10^9),数组所有元素求和,mod p可以表示为int

复制代码
auto it=last.find((s-x+p)%p);
复制代码
class Solution {
public:
    int minSubarray(vector<int>& nums, int p) {
        int n=nums.size();
        int x=reduce(nums.begin(),nums.end(),0LL)%p;
        if(x==0) return 0; //允许子数组为空
        
        int ans=n,s=0;
        unordered_map<int,int> last{{s,-1}}; // 前缀和模p为s的位置是-1(还未开始)
        for(int i=0;i<n;i++){  //遍历右端点,寻找满足条件的左端点
            s=(s+nums[i])%p;
            last[s]=i;  //更新较近的下标
            auto it=last.find((s-x+p)%p);
            if(it!=last.end()) ans=min(ans,i-it->second);
        }

        if(ans==n) return -1;
        else return ans;
    }
};
相关推荐
shehuiyuelaiyuehao1 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民3 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾3 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP3 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin4 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_104 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
纪念 2295 小时前
数据结构排序(三)
数据结构
船厂电气自动化ai大模型5 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳6 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了6666 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法