零钱兑换 + 圆圈中最后剩下的数字

90 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情

零钱兑换

一、题目描述

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11

输出:3

解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3

输出:-1

示例 3:

输入:coins = [1], amount = 0

输出:0

提示:

1 <= coins.length <= 12

1 <= coins[i] <= 231 - 1

0 <= amount <= 104

二、思路讲解

以示例1为例,我们设dp[i]为目标面额i的最小钱币数,那么我们所求的就是dp[11]。假如我们知道dp[10],那么再加一个金币是dp[11]了;同理,我们如果知道dp[6],那么再加一个面额为5的金币也是dp[11]了;我们如果知道dp[9],再加一个面额为2的金币也是dp[11]了。

所以,dp[11] 实际上就是dp[10]+1,或者dp[9]+1,或者dp[6]+1,具体取哪个值呢?就看哪个值小,因为我们要求最小金币数。故:

min {dp[i-可能面额1], dp[i-可能面额2] , dp[i-可能面额3] ……} +1 i > 0

image.png

三、Java代码实现

class Solution {
    public int coinChange(int[] coins, int amount) {
 
        int []dp = new int[amount+1];
        //初始化为amount+1, 便于后面min比较
        for(int i=1; i<amount+1; i++) {
            dp[i] = amount+1;
        }
        dp[0] = 0;
        //外层循环枚举所有可能的面值
        for(int i=0; i<amount+1; i++) {
            //内层循环求出该面值下所有可能选择的最小值
            for(int coin : coins) {
                //过滤掉不可能的情况
                if(i<coin) {
                    continue;
                }
                dp[i] = Math.min(dp[i], dp[i-coin]+1);
            }
        }
        return (dp[amount]==(amount+1)) ? (-1) : dp[amount];
    }
}

圆圈中最后剩下的数字

一、题目描述

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:

输入: n = 5, m = 3

输出: 3

示例 2:

输入: n = 10, m = 17

输出: 2

限制:

1 <= n <= 10^5

1 <= m <= 10^6

二、思路讲解

如果圆圈中只有一个数字,那么他的下标一定是0;

如果圆圈中有两个数字,那么所求数字的下标一定是0+m,如果超出了长度2,那就再%2;

如果圆圈中有三个数字,那么所求数字的下标一定是(0+m)%2 +m,如果超出了长度3,那就再%3

……

已经可以看出了,当有n个数字的时候,所求数字f(n)为:

f(n) = (f(n-1) + m) % i

三、Java代码实现

class Solution {
    public int lastRemaining(int n, int m) {
 
        int f = 0;    
        for(int i=2; i<=n; i++) {
            f = (f+m)%i;
        }
        return f;
    }
}

四、时空复杂度分析

时间复杂度:O(N)

空间复杂度:O(1)