LeetCode523:连续子数组和

1、未考虑的情况:
k=0的情况,一般涉及到%和/都要优先考虑到除数为0的情况。
k=0且数组中有连续两个0的情况,返回true
双层循环,复杂度(O(n^2))
代码:

package com.leetCode.dp;

public class leet523 {
	/**
	 * 修改1:k=0的情况,会出现%k除数为0的错误
	 * 修改2:在1的基础上k=0直接返回false是不行的,如果数组中有连续的两个0,结果应该是true
	 * @param args
	 */
	public static void main(String[] args) {
		int[] nums = {0,1,0};
		System.out.println(checkSubarraySum(nums,0));
	}
	public static boolean checkSubarraySum(int[] nums, int k) {
		boolean flag = false;
		for(int i=0;i<nums.length-1;i++)
		{
			int now=nums[i];
			for(int j=i+1;j<nums.length;j++)
			{
				now+=nums[j];
				if(k==0&&now==0) return true;
				if(k==0) continue;
				if(now%k==0) return true;
			}
		}
		return flag;
    }
}

2、题解中优化做法
主要思想:
A、两个不同的前缀和的余数相等,意味着这两个前缀和之差就是k的倍数
B、sum=sum%k对求解前缀和的余数没有影响,他只是让sum和余数之间的差去掉,但为什么这样子
做呢,有两个好处
a.加入①,碰到[1,0,1] k=2这种nums[i]都小于k的,sumk的,处理框架依然在A的范围内
b.碰到k
0时,处理框架也依然在A的范围
使用HashMap记录,到第i个数据,前i个数据和%k的值

代码:

public class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        int sum = 0;
        HashMap < Integer, Integer > map = new HashMap < > ();
        map.put(0, -1);
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (k != 0)
                sum = sum % k;
            if (map.containsKey(sum)) {
                if (i - map.get(sum) > 1)
                    return true;
            } else
                map.put(sum, i);
        }
        return false;
    }
}


作者:LeetCode
链接:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/lian-xu-de-zi-shu-zu-he-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:guanzhanyi
链接:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/guan-fang-di-san-ge-ti-jie-hashmapde-li-jie-he-xia/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值