给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。

示例 1:

输入: [23,2,4,6,7], k = 6
输出: True
解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。

示例 2:

输入: [23,2,6,4,7], k = 6
输出: True
解释: [23,2,6,4,7]是大小为 5 的子数组,并且和为 42。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/continuous-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————
解题思路:
(1)维护一个数组copy_nums,数组中的每个值copy_nums[i]是nums[0]到nums[i]的总和。这样可以通过两次循环遍历copy_nums中两两数据之间的差值是否是k的倍数。

class Solution:def checkSubarraySum(self, nums: List[int], k: int) -> bool:length = len(nums)if length <=1:return Falsecopy_nums = nums[:]  # 首先对原数组进行复制for i in range(1,length):  # 计算从nums[0]到nums[i]的累加和copy_nums[i] += copy_nums[i-1]for i in range(length-1):for j in range(i+1,length):ans = nums[i] + copy_nums[j] - copy_nums[i]  # 比较数组中两两之间的差值是否是k或者k的倍数if k==ans or (k!=0 and ans%k==0):return Truereturn False

(2)可以知道,当数组中存在连续子数组的和等于k或者k的倍数,假设为nums[i]到nums[j]之间的子数组,那么可以知道sum[i-1]%k==sum[j]%k,其中sum[i-1]是nums数组中前i-1个值之和,sum[j]是nums数组中前j个值之和。因为nums[i]到nums[j]的和为k的倍数。所以我们可以从数组第一个数据开始,计算前i个数据之和和k的余数,如果sum[i]%k == sum[j]%k,同时j-i>1,则数组中存在这样的连续子数组之和是k的倍数。

class Solution:def checkSubarraySum(self, nums: List[int], k: int) -> bool:if k==0:  # 当k的值为0,数组中元素都是非负的,要是条件成立,数组中必须存在两个连续的0值。for i in range(len(nums)-1):if nums[i] + nums[i+1] == 0:return Truereturn Falseres = 0dicts = {}    # 创建一个字典,字典的key是余数,value是对应的位置索引dicts[0] = -1  # 创建起始点,位置为-1,与k的余数为0,这里很重要for index,num in enumerate(nums):ans = (num + res) % kres = ansif ans in dicts.keys():  # 当找到两部分余数是一样的,同时两者之间的索引差大于1时,则返回Trueif index - dicts[ans] > 1:return Truedicts.setdefault(ans,index)  # 如果字典中不存在这余数,则创建一个余数return False

leetcode —— 523. 连续的子数组和相关推荐

  1. leetcode 523. 连续的子数组和

    给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且 子数组元素总和为 k 的倍数. 如果存在,返回 true : ...

  2. LeetCode-笔记-523. 连续的子数组和

    LeetCode-笔记-523. 连续的子数组和 看完525题来看523题 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至 ...

  3. 文巾解题 523. 连续的子数组和

    1  题目描述 2 解题思路 2.1 前缀和+逐元素遍历 一开始想用前缀和+逐起止坐标来遍历的方法判断有没有符合条件的子数组.(就是先算出a[0], a[0]+a[1], a[0]+a[1]+a[2] ...

  4. Java 第 33 课 1282. 用户分组 523. 连续的子数组和

    第 33 课 [1282. 用户分组](https://leetcode-cn.com/problems/group-the-people-given-the-group-size-they-belo ...

  5. 523. 连续的子数组和

    链接:https://leetcode-cn.com/problems/continuous-subarray-sum/ 题解:https://leetcode-cn.com/problems/con ...

  6. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  7. LeetCode 523. 连续的子数组和(求余 哈希)

    1. 题目 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: 输入 ...

  8. Leetcode--523. 连续的子数组和

    给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例 1: 输入: [23, ...

  9. LeetCode 长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr ...

最新文章

  1. 图像HSV和RGB的相互转换
  2. 用Uber的方式管理机器学习模型
  3. VTK:小部件之ImageTracerWidgetInsideContour
  4. 将not exists更改为外连接
  5. 库克再次被问及苹果汽车,这一次他选择不予置评
  6. android提权system,Android push app to /system/app/
  7. 学习银行转账系统-代码摘取csdn
  8. docker容器的前台后台运行
  9. Springboot 注解最全详解
  10. 物联网开发笔记(5)- 使用Wokwi仿真树莓派Pico实现LED灯交替闪烁(续)
  11. 由双系统变单系统——如何删除另一个操作系统
  12. 【亲测纯净版】10月最新晴天贷立刻贷小额借贷大数据借贷平台网站源码已对接免签支付
  13. 使用windows为Android手机进行瘦身
  14. 萌新带你开车上p站(二)
  15. 怎么在添加为知笔记编辑器/为知笔记怎么用其他编辑器编辑/为知笔记怎么才能用Word/notepad++编辑
  16. java catch后面_java 异常被catch后 将会继续执行的操作
  17. 单线激光雷达Windows测试备忘
  18. LINUX 报错:使用scp复制文件No such file or directory 及主机名注意事项
  19. Ubuntu安装Lua
  20. 项目目录游戏服务器,Yivgame是一个基于go-kit的微服务游戏服务器

热门文章

  1. ibatis+Castle.MCV 版 NPetshop3
  2. Nginx使用HTTPS建立与上游服务器的网络通信
  3. 容器编排技术 -- Kubernetes kubectl expose命令详解
  4. Spring安全示例教程
  5. 如何选择开源许可证?
  6. 【Java】计算8+88+888+8888+....前12项的和
  7. 【Java】输入三角形的三边长,求三角形的面积
  8. 【Python】jieba库的使用
  9. C#LeetCode刷题之#263-丑数(Ugly Number)
  10. mysql修改表结果