连续的子数组和--力扣
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连续的子数组和--力扣相关的知识,希望对你有一定的参考价值。
前言
给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:
子数组大小 至少为 2 ,且
子数组元素总和为 k 的倍数。
如果存在,返回 true ;否则,返回 false 。
如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。。
一、示例
示例 1:
输入:nums = [23,2,4,6,7], k = 6
输出:true
解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
示例 2:
输入:nums = [23,2,6,4,7], k = 6
输出:true
解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。
42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
示例 3:
输入:nums = [23,2,6,4,7], k = 13
输出:false
二、代码解析
1.暴力解题–超出时间限制
代码如下(示例):
bool checkSubarraySum(vector<int>& nums, int k)
{
for (int i = 0; i < nums.size() - 1; ++i)
{
for (int j = i; j < nums.size() - 1; ++j)
{
int Sum = 0;
for (int k = j + 1; k >= i; --k)
{
Sum += nums[k];
}
if (Sum % k == 0)
{
return true;
}
}
}
return false;
}
结果
2.前缀和 + 哈希表
代码如下(示例):
bool checkSubarraySum(vector<int>& nums, int k)
{
int m = nums.size();
if (m < 2)
{
return false;
}
unordered_map<int, int> mp;
mp[0] = -1;
int remainder = 0;
for (int i = 0; i < m; i++)
{
remainder = (remainder + nums[i]) % k;
if (mp.count(remainder))
{
int prevIndex = mp[remainder];
if (i - prevIndex >= 2)
{
return true;
}
}
else
{
mp[remainder] = i;
}
}
return false;
}
结果
三、测试
代码如下(示例):
#include<vector>
#include <iostream>
#include <unordered_map>
using namespace std;
bool checkSubarraySum(vector<int>& nums, int k)
{
int m = nums.size();
if (m < 2)
{
return false;
}
unordered_map<int, int> mp;
mp[0] = -1;
int remainder = 0;
for (int i = 0; i < m; i++)
{
remainder = (remainder + nums[i]) % k;
if (mp.count(remainder))
{
int prevIndex = mp[remainder];
if (i - prevIndex >= 2)
{
return true;
}
}
else
{
mp[remainder] = i;
}
}
return false;
}
int main()
{
vector<int> nums = { 23,2,6,4,7 };
int k = 6;
cout << checkSubarraySum(nums, k);
return 0;
}
结果
总结
以上是关于连续的子数组和--力扣的主要内容,如果未能解决你的问题,请参考以下文章