力扣 560. 和为K的子数组

题目

题目
链接560. 和为K的子数组

总结

思考过程

  1. 看到题目之后,脑子里第一个想法居然是深度优先搜索,当然,并没有能够实现出来。
  2. 想到枚举了,我当时想用个双循环遍历一遍不就可以找出来了吗?但是第一次没有琢磨出来,又返回去琢磨深度优先搜索,最后终于决定用枚举。
int subarraySum(vector<int>& nums, int k) {
		int ans = 0;
		for (int i = 0; i < nums.size(); i++) {
			 int sum = nums[i];
			 if (sum == k)
			 {
			 	ans++;
			 	continue;
			 }
			for (int j = i + 1; j < nums.size(); j++) {
                sum = sum + nums[j];
				if (sum == k) {
					ans++;
                    break;
				}
				if (sum > k) break;
			}
		}
		return ans;
	}

本以为这题算是解决了,已提交,嗯,果然没有我想的这么简单。多处用例不能通过。

  1. 于是,我去看了题解,咦,也是用的枚举,看来思路是对的。然后用他的代码跑了一遍,通过了。
public class Solution {
    public int subarraySum(int[] nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            int sum = 0;
            for (int j = i; j >= 0; j--) {
                sum += nums[j];
                if (sum == k) {
                    ans++;
                }
            }
        }
        return ans;
    }
}

然后我对比了一下我写的代码和这个的区别。

我的条件判断太多了

	if (sum == k){
		ans++;
		continue;
	}

外循环的这句条件判断,会让类似于[1,0,0,0] 1 这样的测试用例无法通过

	if (sum == k) {
		ans++;
	    break;
	}

内循环的这句条件判断的break,会让类似[0,0,0,0] 0这样的测试用例通不过。

if (sum > k) break;

内循环的这句判断,会让类似于[1,2,-1] 2 这类测试用例通不过。

  1. 但是我有点不明白他的内循环条件为什么要倒着来,然后我就去试了一下不倒着能不能行,提交显示超时,搞不懂为什么。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值