Leetcode.1590 使数组和能被 P 整除
创始人
2024-06-01 04:05:12
0

题目链接

Leetcode.1590 使数组和能被 P 整除 Rating : 2039

题目描述

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

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

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

示例 1:

输入:nums = [3,1,4,2], p = 6
输出:1
解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。

示例 2:

输入:nums = [6,3,5,2], p = 9
输出:2
解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。

示例 3:

输入:nums = [1,2,3], p = 3
输出:0
解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。

示例 4:

输入:nums = [1,2,3], p = 7
输出:-1
解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除。

示例 5:

输入:nums = [1000000000,1000000000,1000000000], p = 3
输出:0

提示:

  • 1≤nums.length≤1051 \leq nums.length \leq 10^51≤nums.length≤105
  • 1≤nums[i]≤1091 \leq nums[i] \leq10^91≤nums[i]≤109
  • 1≤p≤1091 \leq p \leq 10^91≤p≤109

分析:前缀和 + 哈希表

我们分析如下例子,nums = [7,3,6,2,5,6,2] , p = 10
在这里插入图片描述
我们注意到,整个数组的和为 31,与 p = 10的余数 r = 1

要让去掉一个 子数组 之后,剩下元素和是 p的倍数,那么这个被删除的 子数组的和sump的余数也应该是 r

在这里插入图片描述
比如,删除 [5,6],剩下的元素和为 20,正好可以整除 p

所以,我们的目的就是,找出这样的最短的一段 [ i , j ],使得 (s[j] - s[i]) % p == r,即找出最短的一个子数组,该子数组的和 sum,让它和 p的余数 为r

我们可以将 (s[j] - s[i]) % p == r稍微变形,(s[i] % p) == (s[j] - r + p) % ps[j] - r + p是为了防止 s[j] - r变成负数。

我们用哈希表 m记录 s[j] % p上一次出现的位置 i

如果哈希表中存在 s[j] % p,说明 (s[j] - s[i]) % p == r,就找到了这样的一个子数组,子数组的长度为 j - i,我们只需要记录最短的那个长度 返回即可。

时间复杂度:O(n)O(n)O(n)

C++代码:

class Solution {
public:int minSubarray(vector& nums, int p) {int n = nums.size();vector s(n+1);for(int i = 1;i <= n;i++) s[i] = (s[i-1] + nums[i-1]) % p;int r = s[n];int ans = n;unordered_map m;for(int j = 0;j <= n;j++){m[s[j]] = j;if(m.count((s[j] - r + p) % p)){int i = m[(s[j] - r + p) % p];ans = min(ans,j - i);}}return ans == n ? -1 : ans;}
};

Python代码:

class Solution:def minSubarray(self, nums: List[int], p: int) -> int:s = list(accumulate(nums,initial = 0))r = s[-1] % pn = len(nums)ans = nm = {}for j,sum in enumerate(s):m[sum % p] = ji = m.get((sum - r) % p,-n)ans = min(ans,j - i)return ans if ans != n else -1

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...