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;
    }
};
相关推荐
垆边人似月.3 分钟前
华为题:矩阵中的最长递增路径
算法·深度优先
小诗懂技术6 分钟前
linux驱动中断,相关中断的方式与适用场景
linux·arm开发·驱动开发·算法
不会就选b10 分钟前
算法日常・每日刷题--<动态规划>25
算法
Keep_Trying_Go19 分钟前
分割算法FastSAM论文详解
深度学习·算法·计算机视觉
星夜离尘5620 分钟前
MATLAB 5 点滑动平均:filter 与 conv 的输出对齐,以及 2 样本延时的含义
开发语言·算法·matlab·滤波·fir
Dovis(誓平步青云)24 分钟前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
专注API从业者25 分钟前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
开开心心就好28 分钟前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
闻缺陷则喜何志丹1 小时前
详细设计说明书的内容要求
算法·测试·存储
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质