LeetCode Continuous Subarray Sum 题解 同余前缀和 Hash表
题意
给定一个数组和一个整数k,返回是否存在一个长度至少为2的连续子数组的和为k的倍数。
思路
和上一篇博客的思路基本一致。
LeetCode subarray-sum-equals-k题解
所不同的是,子数组至少长度为2。因此需要一个缓冲区,延缓往Hash表中加数的操作。
另外,因为是和变成是k的倍数。利用同余的知识易得我们维护的前缀和是群ZkZ_kZk中的和。
ps.这里我犯了一个错误,没有考虑k取0的情况,当值RE一次,然后简单的改成返回true再次WA一次。

特殊情况k=0
不在取模,不考虑同余了。注意到0的倍数的集合中只有0一个元素,因此直接变成和为k=0的情况即可。
Source Code 1
考虑到子数组的最小大小如果变化的通用性,我用了一个队列做缓冲。
现在写博客的时候突然想到其实可以用两个sum,同步移动,分别往后算就好了。一个负责枚举的右边的sum,一个负责要更新hash表的sum.也可以实现通用性。
结果:
- 8 ms 49.62%
- 40.9 MB 100%
嫌49.62%太低,我就改了一下延迟更新hash表的方式。
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
final int minSubArrLen = 2;
int len = nums.length;
if (len < minSubArrLen)
return false;
Queue<Integer> q = new LinkedList<Integer>();
int sum = 0;
q.offer(sum); // sum[-1]
int i;
for (i =0; i < minSubArrLen-1; ++i) {
sum = f((sum+nums[i]),k);
q.offer(sum); // sum[i]
}
//key:sum(mod k),value:the count of sum[i] where i<r
Set<Integer> l = new HashSet<Integer>();
int tmp;
for (;i < len; ++i) {
tmp = q.poll();
l.add(tmp);
sum = f((sum+nums[i]),k);
q.offer(sum);
if (l.contains(sum))
return true;
}
return false;
}
int f(int a,int b) {
return b == 0 ? a : a%b;
}
}
Source Code 2
结果
- Runtime: 6 ms, faster than 94.01%
- Memory Usage: 41.3 MB, less than 100.00%
class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int len = nums.length;
if (len < 2)
return false;
int sum = 0;
//key:sum(mod k),value:the count of sum[i] where i<r
Set<Integer> l = new HashSet<Integer>();
l.add(0); // sum[-1]
sum = (k != 0) ? (nums[0])%k : nums[0]; //sum[0]
int t = sum;
for (int i = 1;i < len; ++i) {
sum = (k != 0) ? (sum+nums[i])%k : sum+nums[i];
if (l.contains(sum))
return true;
l.add(t);
t = sum;
}
return false;
}
}
LeetCode Continuous Subarray Sum 题解 同余前缀和 Hash表的更多相关文章
- [LeetCode] Continuous Subarray Sum 连续的子数组之和
Given a list of non-negative numbers and a target integer k, write a function to check if the array ...
- LeetCode Continuous Subarray Sum
原题链接在这里:https://leetcode.com/problems/continuous-subarray-sum/description/ 题目: Given a list of non-n ...
- leetcode 560. Subarray Sum Equals K 、523. Continuous Subarray Sum、 325.Maximum Size Subarray Sum Equals k(lintcode 911)
整体上3个题都是求subarray,都是同一个思想,通过累加,然后判断和目标k值之间的关系,然后查看之前子数组的累加和. map的存储:560题是存储的当前的累加和与个数 561题是存储的当前累加和的 ...
- [LeetCode] 560. Subarray Sum Equals K 子数组和为K
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- [LintCode] Continuous Subarray Sum II
Given an integer array, find a continuous rotate subarray where the sum of numbers is the biggest. Y ...
- LintCode 402: Continuous Subarray Sum
LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...
- Continuous Subarray Sum II(LintCode)
Continuous Subarray Sum II Given an circular integer array (the next element of the last element i ...
- [leetcode]523. Continuous Subarray Sum连续子数组和(为K的倍数)
Given a list of non-negative numbers and a target integer k, write a function to check if the array ...
- [LintCode] Continuous Subarray Sum 连续子数组之和
Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...
随机推荐
- LDAP安装
一.介绍 LDAP 全称:Lightweight Directory Access Protocol,即“轻量级目录访问协议”. LDAP目录以树状的层次结构来存储数据.如果你对自顶向下的DNS树或U ...
- vsftp管理用户
[root@localhost vsftpd]# cat auto_createftp.py #!/usr/bin/env python #_*_coding:utf-8_*_ #date:20180 ...
- [Pyhton]连接MSSQL实例并执行SQL语句
运行环境: 服务器端: MSSQL 2014 Server 2012 R2 程序端: Python 3.7.4 MacOS 10.14.6 CentOS Linux release 7.7.1908 ...
- Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新
使用Spring Cloud Config我们能实现服务配置的集中化管理,在服务启动时从Config Server获取需要的配置属性.但如果在服务运行过程中,我们需要将某个配置属性进行修改,比如将验证 ...
- Linux运维--实践-Rally
1.rally简介 OpenStack Rally 是一个自动化测试工具,社区希望通过 Rally 来解答 "How does OpenStack work at scale?(如何规模化运 ...
- Spark之RDD本质
1.在一个完整的数据转换流程里往往涉及到多个具有衍生关系RDD,这些RDD其实是通过逻辑串联来利用装饰器模式层层包装扩展的的一堆对象,这些相邻RDD间必须有继承关系.并且比Java中的装饰器来的更彻底 ...
- Vue.js 从源码理解v-for和v-if的优先级的高低
在vue.js里面,v-for和v-if是可以一起使用作用在某个元素上,网上看到一篇文章说永远不要把v-for和v-if同时用在同一个元素上,感觉有点瞎扯,官网也注明了可以一起使用的,还把两个指令的优 ...
- Android中实现照片滑动时左右进出的动画的xml代码
场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Codeforces Round447 D树上前缀和
已知完全二叉树和每条边的权值,q次询问,每次给出sta起点和H. w=(H-点到sta的权值),求w>0的所有w的加和. 这题用树上前缀和来写,e[i]记录子树上的点到点i的距离,sum[i][ ...
- Erlang/Elixir精选-第6期(20200113)
精选文章 Implementing languages on the Erlang VM. -Robert Virding. 因为视频没有显示PPT,PPT可以在点击这里下载. leex - lexi ...