首页 > 其他分享 >1590. 使数组和能被 P 整除

1590. 使数组和能被 P 整除

时间:2023-04-08 22:56:12浏览次数:46  
标签:前缀 idx nums int sum 1590 数组 ans 整除

题目链接:1590. 使数组和能被 P 整除

方法:前缀和 + 哈希

解题思路

(1)要求\((sum - sunSum)\) % \(p = 0\),即要求 \([sum - (s[j] - s[i])]\) % \(p = 0\), 即 \(sum\) % \(p = (s[j] - s[i])\) % \(p\),即 \(s[j]\) % \(p - sum\) % \(p = s[i]\) % \(p\);
(2)上述中的\(sum\)可以提前确定下来,\(s[j]\)为当前的前缀和,即要寻找之前计算过的前缀和中是否有\(s[i]\),之前计算过的前缀和被存入\(idx\)中。

代码

class Solution {
public:
    int minSubarray(vector<int>& nums, int p) {
        int x = 0;
        for (auto &num : nums) x = (x + num) % p;

        int ans = nums.size(), s = 0;
        unordered_map<int, int> idx{{s, -1}};
        for (int i = 0; i < nums.size(); i ++ ) {
            s = (s + nums[i]) % p;
            idx[s] = i; // 保证s的值为当前最靠近右端的下标,保证区间最小
            auto it = idx.find((s - x + p) % p);
            if (it != idx.end()) ans = min(ans, i - it->second);
        }
        return ans == nums.size() ? -1 : ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(n)\)。

相关题目

1. 两数之和

标签:前缀,idx,nums,int,sum,1590,数组,ans,整除
From: https://www.cnblogs.com/lxycoding/p/17299476.html

相关文章

  • 二维数组
    在刷力扣题目是会遇到这种情况int**generate(intnumRows,int*returnSize,int**returnColumnSizes){}intnumRows:表示这传入的是一个数。int*returnSize:表示这传入的是一个数的地址。int**returnColumnSizes:表示这传入的是一个数组的地址。为什么要这么做呢?答:在......
  • 1144. 递减元素使数组呈锯齿状
    题目链接:1144.递减元素使数组呈锯齿状方法:找规律+模拟解题思路对于一个整数数组\(nums\),可以转换为题目中两种锯齿数组,对于两种情况的转换取最小值。并且由于操作只能将一个元素减1,因此:对于第1种情况,只用下标为奇数的元素需要减小到比两边最小值小1;对于第2种情况,只用下......
  • 数组扁平化
    vararr=[{id:1,title:'我是1目录',children:[{id:11,title:'我是1-1目录',children:[{id:111,title:&#......
  • 『0016』 - Solidity Types - 玩转 Solidity 数组 (Arrays)
    作者:黎跃春,学习目标掌握Arrays的可变不可变的创建深度理解可变数组和不可变数组之间的区别二维数组memoryarrays的创建bytes0~bytes32、bytes与byte[]对比固定长度的数组(Arrays)固定长度类型数组的声明pragmasolidity^0.4.4;contractC{//数组的长度为5,数组里面的存储......
  • 『0013』 - Solidity Types - 固定大小字节数组(Fixed-size byte arrays)
    作者:黎跃春,固定大小字节数组(Fixed-sizebytearrays)固定大小字节数组可以通过bytes1,bytes2,bytes3,…,bytes32来进行声明。PS:byte的别名就是byte1。bytes1只能存储一个字节,也就是二进制8位的内容。bytes2只能存储两个字节,也就是二进制16位的内容。bytes3只能存储三个字......
  • 『0014』 - Solidity Types - 动态大小字节数组(Dynamically-sized byte array)
    作者:黎跃春,一、Dynamically-sizedbytearraystring是一个动态尺寸的UTF-8编码字符串,它其实是一个特殊的可变字节数组,string是引用类型,而非值类型。bytes动态字节数组,引用类型。根据经验,在我们不确定字节数据大小的情况下,我们可以使用string或者bytes,而如果我们清楚的知道或者......
  • 【Java】数组
    数组是编程语言中常见的数据结构,用来存储一组相同数据类型的数据,可以通过整型索引访问数组中的每一个值。需要注意,同一个数组中存储的所有元素的数据类型必须相同。根据数组存放元素的组织结构,可将数组分为一维数组、二维数组以及多维(三维及以上)。创建数组:data_type[]varName;......
  • JavaScript 数组笔记
    添加和删除数组项添加push()push()方法:向数组的末尾添加一个或多个元素,并返回修改后的数组长度。语法:arr.push(element1[,...[,elementN]])参数:element1,...,elementN:要添加到数组末尾的元素。示例:constfruits=['apple','banana','orange'];constnewLength......
  • 二维数组的初始化
    ⑴分行进行初始化inta[2][3]={{1,2,3},{4,5,6}};在{}内部再用{}把各行分开,第一对{}中的初值1,2,3是0行的3个元素的初值。第二对{}中的初值4,5,6是1行的3个元素的初值。相当于执  行如下语句:inta[2][3];a[0][0]=1;a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1......
  • 数组模拟环形队列的思路及代码
    JAVA实现数组模拟环形队列的思路及代码前言在对Java实现数组模拟队列零了解的情况下,建议先去阅读《JAVA实现数组模拟单向队列的思路及代码》一文,可以辅助理解本文核心思想。一、环形数组队列实现:让数组达到复用的效果,即:当我们从数组队列中取出了数据,那取出数据后后这个空间可......