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

1059.使数组和能被P整除

时间:2023-03-10 22:55:24浏览次数:29  
标签:nums int 1059 sum 数组 ans 整除 mod

给你一个长度为 n 的整数数组 nums 和一个整数 p,请你选出一个 非空 的子数组使得该子数组元素和对 p 的余数是 0,但不能选出全部元素。

计算这个子数组的长度,如果不存在这样的子数组,返回 -1

一个数组的 子数组 定义为一个由数组中零个或者更多个连续元素组成的数组。

示例 1:

输入:nums = [3,1,4,2], p = 6 输出:1 解释:我们选出数列中的一个数字 4,使得它和剩下的数的和等于 6。

示例 2:

输入:nums = [6,3,5,2], p = 9 输出:2 解释:我们选出前两个数字,它们的和为 9,但它们不是整个数组的和。

示例 3:

输入:nums = [1,2,3], p = 3 输出:0 解释:这个数组本身就可以被 3 整除。

示例 4:

输入:nums = [1,2,3], p = 7 输出:-1 解释:没有任何子数组满足题意。

提示:

  • 1 <= n <= 10^5
  • 1 <= nums[i] <= 10^9
  • 1 <= p <= 10^9

解法

首先求出 nums 中所有元素的和 sum,如果 sum % p == 0,则整个数组就是一个符合要求的子数组,返回 0 即可。

如果 sum % p != 0,我们需要找到一个子数组,使得它的和对 p 取模等于 sum % p。我们可以用前缀和的方法来做。

具体来说,我们维护一个前缀和数组 prefix,其中 prefix[i] 表示 nums 中前 i 项的和。然后我们枚举右端点 i,左端点设为 j,判断子数组 nums[j..i] 的和是否等于 sum % p。如果等于,记录子数组长度和当前最小长度的较小值。如果不等于,继续枚举,直到找到符合要求的子数组或者枚举完所有子数组。

为了加速查找,我们可以使用哈希表来存储每个前缀和对 p 取模后的值以及对应的下标。在枚举右端点时,我们只需要查询哈希表中是否存在对应的前缀和即可。

代码实现

public int minSubarray(int[] nums, int p) {
    int len = nums.length;
    int mod = 0;
    for (int n : nums) {
        mod = (mod + n) % p;
    }
    if (mod == 0) {
        return 0;
    }
    int ans = Integer.MAX_VALUE;
    Map<Integer, Integer> map = new HashMap<>();
    map.put(0, -1);
    int sum = 0;
    for (int i = 0; i < len; i++) {
        sum = (sum + nums[i])%p;
        int gap = (sum - mod + p) % p;
        if (map.containsKey(gap)) {
            ans = Math.min(i - map.get(gap), ans);
        }
        map.put(sum, i);
    }
    return ans == len || ans == Integer.MAX_VALUE ? -1 : ans;
}

时间复杂度:O(n)

空间复杂度:O(n)

 

标签:nums,int,1059,sum,数组,ans,整除,mod
From: https://www.cnblogs.com/lyInfo/p/17204909.html

相关文章

  • 代码随想录-数组
    二分查找704.二分查找-力扣(LeetCode)intsearch(int*nums,intnumsSize,inttarget){intleft=0;intright=numsSize-1;intmid=0;i......
  • 寻找两个正序数组的中位数
    寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时......
  • ES6-ES11 ES10数组方法扩展-flat与flatMap
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • java-IO-字节流读数据(一次读一个字节数组数据)
         ......
  • java学习日记20230310-数组
    数组数组/排序/查找数组可以存放多个统一类型的数据,数组本身也是一种数据类型,引用类型;    array.length标识数组的大小/长度数组的定义数据类型[]数组名......
  • numpy数组中根据判定条件提取索引位置
    要求:我有两个numpy类型的数组,第一个维度都是相同的,其中一个数组中都是0或者1,如果是1,则将两一个数组中的相同位置提取出来形成一个新的numpy数组可以使用numpy的boolean......
  • java自定义类数组的初始化
    也就是说,在声明了自定义类的数组之后,对每一个数组元素的初始化,都要为其new一个对象出来使得指针指向该对象,Java语言本身是不提供在自定义类数组声明时候自动创建新对象的方......
  • C++ 数组 指针小记
    voidfun(int*aa){return;}int*a=newint[16];memset(a,0,16);fun(a);voidfun(int*aa){return;}inta[16]={0};fun(a);  总之,两......
  • C# 对一维数组进行分组,每组固定数量
    效果:[1,2,3,4,5,6]拆分为每个数组内2个数字[[1,2],[3,4],[5,6]]///<summary>///根据数量对数组进行分组///</summary>///<paramname="list"></param>///<pa......
  • spring学习48-属性注入注入数组和列表的说明
    pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchem......