网站的建设费用,网站源码设计,网站建设 佛山,互联网公司上市一、题目
给你一个正整数数组 nums#xff0c;请你移除 最短 子数组#xff08;可以为 空#xff09;#xff0c;使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。
请你返回你需要移除的最短子数组的长度#xff0c;如果无法满足题目要求#xff0c;返回 -1…一、题目
给你一个正整数数组 nums请你移除 最短 子数组可以为 空使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。
请你返回你需要移除的最短子数组的长度如果无法满足题目要求返回 -1 。
子数组 定义为原数组中连续的一组元素。 来源力扣LeetCode 链接https://leetcode.cn/problems/make-sum-divisible-by-p/description/
二、C解法
我的思路及代码
我的方法时间复杂度太高导致不能通过测试用例 采用前缀和的思路然后从头开始用不同的窗口大小对数组进行遍历窗口内的元素即为被删除的元素直到最后剩下的数组元素和可以被整除返回当前的窗口大小否则返回 -1。由于本题目只需要判断是否可以被整除所以在前缀和中我们可以简化存储的数据每次可以存储取余后的数据。
class Solution {
public:int minSubarray(vectorint nums, int p) {int size nums.size();int prefixSum[size1];int ans1;prefixSum[0] 0;for(int i1;inums.size()1;i){prefixSum[i] (prefixSum[i-1]nums[i-1])%p;}if(prefixSum[size]%p0)return 0;while(anssize1){for(int jans;jsize1;j){if((prefixSum[size]-(prefixSum[j]-prefixSum[j-ans]))%p0)return ans;}ans;}return -1;}
};时间复杂度O(n2)其中 n 是数组 nums 的长度空间复杂度O(n)数组需要 O(n) 的空间
官方参考代码
前缀和哈希表 时间复杂度O(n)其中 n 是数组 nums 的长度。遍历数组 nums 需要 O(n) 的时间空间复杂度O(n)保存哈希表需要 O(n) 的空间