for里面多条件判断慎用

问题产生的原因是最近在leetcode刷题,零钱兑换2中产生的,思路一下子陷进了死胡同,放两段代码,上面的是错误的,下面是正确的。

//错误的
public int change(int amount, int[] coins) {
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        for (int coin : coins) {
            for (int i = 1; i <= amount && i >= coin; i++) {
                dp[i] += dp[i - coin];
            }
        }
        return dp[amount];
}

//正确的
public int change(int amount, int[] coins) {
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        for (int coin : coins) {
            for (int i = 1; i <= amount; i++) {
            	if (i >= coin) dp[i] += dp[i - coin];
            }
        }
        return dp[amount];
}

看出啥问题了吧,我吧for里面的判断提到了for循环中间去判断了,只要失败了,这次for就等于结束了,其实也有办法可以把if条件往for中提。

public int change(int amount, int[] coins) {
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        for (int coin : coins) {
            for (int i = coin; i <= amount; i++) {
                dp[i] += dp[i - coin];
            }
        }
        return dp[amount];
}

既然我们需要i大于等于coin才能执行里面的,那i初始值就直接等于coin就好了


版权声明:本文为W2044377578原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。