LeetCode题目523:连续的子数组和

博客围绕数组子数组和为k倍数的题目展开。先介绍题目,即找出数组中连续子数组和是k倍数的情况。接着指出暴力解法会超时,引入同余定理这一技巧判断。还提到用变量存储数组长度可提升速度,最后进行代码解析。

题目

在这里插入图片描述

题目解析

题目的意思是说一个数组里面的子数组(子数组是指数组里面所有数字组成的集合,连续的子数组就是需要连续的)的和是 k 的倍数,也就是说,找出一段连续的子数组能是 k 的倍数。

技巧解析

暴力确实可以解决但是会超时,这个时候就需要一些技巧了,这种一般的判断都是 ( a + b ) % k ;但是有个定理就是同余定理,意思就是说,当(a+b+c)% k == (a+b)% k 的时候说明 c 这个数字是 k 的倍数,也就说明,有一个数是 k 的倍数,当有两个的时候,就可以说明有一段连续的子数组是 k 的倍数
ps:
这里说明一个小技巧,我今天才发现,我一直使用nums.length来表示数组的长度,但今天我发现,如果一开始就用一个变量存储nums.length,后面就使用变量去表示的话会快不少。不多说上图

  • 这是没有用变量表示的
    在这里插入图片描述
    在这里插入图片描述

  • 这是使用变量表示的
    在这里插入图片描述

在这里插入图片描述

  • 鲜明的对比:
    在这里插入图片描述

代码解析:

class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
    	//存储数组长度
		int m = nums.length;
		//如果数组都不大于,说明根本不够
		if(m<2) {
			return false;
		}
		//用来存放之前的大小取余
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		int re = 0
		map.put(re, -1);
		//循环遍历
		for(int i=0;i<m;i++) {
			//与前缀和取余
			re = (re+nums[i])%k;
			//看map集合中是否有一样的
			if(map.containsKey(re)) {
				//如果有,取到当时索引
				int pre = map.get(re);
				//看与现在的索引相对比,是否大于2,如果大于2,说明与之前相比,有两个数相加是K的倍数
				if((i - pre)>=2) {
					return true;
				}
			}else {//如果没有,则存储
				map.put(re, i);
			}
		}
		//循环遍历之后都没有,说明真的没有
		return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值