leetcode 322 广度优先搜索解决,注意剪枝

该博客介绍了一个使用广度优先搜索(BFS)解决寻找最少硬币数量以凑成给定金额的问题。在C++实现中,博主创建了一个解决方案,通过BFS遍历所有可能的硬币组合,并利用剪枝优化来减少搜索空间,最终找到最少硬币数量。当无法凑成总金额时,返回-1。博客内容包括代码实现、示例测试以及执行结果分析。
摘要由CSDN通过智能技术生成

322. 零钱兑换

难度中等1926收藏分享切换为英文接收动态反馈

给你一个整数数组 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

通过次数435,420提交次数955,940

题解:因为题目要返回最小次数,一般思路有动态规划和BFS,这里采用BFS。

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        //sort(coins.begin(),coins.end());
        vector<int> visited(amount+1,0);        //这里增加一个剪枝
        if(amount==0)
            return 0;
        queue<int> qpos;
        qpos.push(amount);
        int times = 0;
        while(!qpos.empty())
        {
            times++;//需要的时间
            int size = qpos.size();
            while (size-- > 0) 
            {
                int temposcur;
                temposcur = qpos.front();
                qpos.pop();
                for(int i = 0; i < coins.size(); i++)
                {
                    if(temposcur-coins[i]>0 && visited[temposcur-coins[i]]==0)
                    {
                        int pos=temposcur-coins[i];
                        visited[pos]=1;
                        qpos.push(pos);
                    }
                    if(temposcur-coins[i]==0)
                        return times;
                }
            }
        }
        return -1;
    }
};

执行结果:

通过

显示详情

添加备注

执行用时:76 ms, 在所有 C++ 提交中击败了59.83%的用户

内存消耗:17.8 MB, 在所有 C++ 提交中击败了10.66%的用户

通过测试用例:188 / 188

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值