leetcode 百天解题 - day 102 - 1590. 使数组和能被 P 整除
题目名称
给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。
请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1 。
子数组 定义为原数组中连续的一组元素。
示例
输入:nums = [3,1,4,2], p = 6
输出:1
解释:nums 中元素和为 10,不能被 p 整除。我们可以移除子数组 [4] ,剩余元素的和为 6 。
输入:nums = [6,3,5,2], p = 9
输出:2
解释:我们无法移除任何一个元素使得和被 9 整除,最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9
题解
采用了前缀和和求余。
定理一:给定正整数 x、y、z、p,如果 y mod p = x,那么 (y−z) mod p=0等价于 z mod p=x。
定理二:给定正整数 x,y,z,p,那么 (y−z) mod p=x 等价于 z mod p=(y−x) mod p。
首先根据题意,如果所有的和求余后为0的话则说明不需要去除任何子数组,所以返回 0
然后首先计算出 数组所有元素和 与 P 的余数 reduce
然后计算数组每一位与前面所有元素的和 与 p 的余数,然后将当前 index 添加到 map数组中。具体参考下方代码
答案
1 | /** |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
DisqusValine