LeetCode-523-连续的子数组和

题目

在这里插入图片描述

失败代码

  • 暴力
	public static int CalSumNum(int[] num) {
		int sum=0;
		for(int i=0;i<num.length;i++) {
			sum+=num[i];
		}
		return sum;
	}
    public static boolean checkSubarraySum(int[] nums, int k) {
    	if(nums.length<2) return false;
    	if(nums.length==2) {
    		if((nums[0]+nums[1]) % k==0) return true;
    		return false;
    	}
    	for(int i=2;i<=nums.length;i++) {
    		for(int j=0;j<=nums.length-i;j++) {
        		int[] temp = new int[i];
    			temp = Arrays.copyOfRange(nums,j,i+j);
    			if(CalSumNum(temp) % k==0) return true;
    		}
    	}
    	return false;
    }
  • 前缀和
    public static boolean checkSubarraySum(int[] nums, int k) {
    	if(nums.length<2) return false;
    	if(nums.length==2) {
    		if((nums[0]+nums[1]) % k==0) return true;
    		return false;
    	}
    	//前缀和数组
    	int[] pre = new int[nums.length];
    	pre[0] = nums[0];
    	for(int i=1;i<nums.length;i++) {
    		pre[i] = pre[i-1]+nums[i];
    	}
    	for(int i=1;i<=nums.length;i++) {
    		for(int j=0;j<nums.length-i;j++) {
    			//寻找[j:i+j]范围内的总和
    			if(j==0 && pre[i+j] % k==0) return true;
    			if(j!=0 && (pre[i+j]-pre[j-1])%k==0) return true;
    		}
    	}
    	return false;
    }

思路

  1. 前缀和,有想过这个思路但是想了想后感觉行不通就放弃了,果然还是敏感度不够
  2. 写了一版前缀和,还是93/94,再滚过去看题解
  3. 哈希存储
    在这里插入图片描述
  4. 哈希表的key:用来储存当前前缀和的余数 哈希表的value:则储存对应的index

代码

    public static boolean checkSubarraySum(int[] nums, int k) {
    	if(nums.length<2) return false;
    	if(nums.length==2) {
    		if((nums[0]+nums[1]) % k==0) return true;
    		return false;
    	}
    	//创建哈希表
    	HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    	map.put(0, -1);
    	int rem=0;
    	//开始遍历nums数组
    	for(int i=0;i<nums.length;++i) {
    		rem = (rem+nums[i])%k;
    		if(map.containsKey(rem)) {
    			int pos = map.get(rem);
    			if((i-pos)>=2) return true;
    		}
    		else map.put(rem, i);
    	}
    	return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值