📣 独立日限时特惠: VIP通行证立减$68
楼主: QDkAc
跳转到指定楼层
上一主题 下一主题
收起左侧

一道有趣的GG面试题

🔗
304671127 2017-2-2 06:10:24 | 只看该作者
全局:
leetcode 322  coin change。面试的followup 是规定每个硬币的次数,不是无限。
回复

使用道具 举报

🔗
kunge12345 2017-2-2 07:01:55 | 只看该作者
全局:
xixiaoxi 发表于 2017-2-2 05:56
我觉得你的算法应该不太对,比如我有1,2,21,25美分的硬币,target number是63。正确答案应该是21+21+2 ...

你没看到lz写的大大的
“并且对于1...m中每一种面值,都可以用你选出的硬币拼出。”
???
回复

使用道具 举报

🔗
shufezq 2017-2-2 07:25:00 | 只看该作者
全局:
304671127 发表于 2017-2-2 06:10
leetcode 322  coin change。面试的followup 是规定每个硬币的次数,不是无限。

followup的话是直接用一个array记录每个硬币的使用次数 然后一样的dp就行了吗
回复

使用道具 举报

🔗
xixiaoxi 2017-2-2 07:35:16 | 只看该作者
全局:
kunge12345 发表于 2017-2-2 07:01
你没看到lz写的大大的
“并且对于1...m中每一种面值,都可以用你选出的硬币拼出。”
???

啊对,哈哈,不好意思,刚才没有看到这句话
回复

使用道具 举报

🔗
bigbearlake 2017-2-5 14:59:34 | 只看该作者
全局:
kunge12345 发表于 2017-1-28 21:47
李口德330 patching array一样的思路,greedy

补充内容 (2017-2-2 07:33):

这个题应该是要用dp,greedy会产生错误比如9,【5, 3, 1】用greedy就是1个5,4个1,但是用dp就可以知道是3个3
回复

使用道具 举报

🔗
kunge12345 2017-2-5 21:41:26 | 只看该作者
全局:
再看一遍题目,我请问你1你如何cover?嗯?
回复

使用道具 举报

🔗
kunge12345 2017-2-5 21:42:41 | 只看该作者
全局:
bigbearlake 发表于 2017-2-5 14:59
这个题应该是要用dp,greedy会产生错误比如9,【5, 3, 1】用greedy就是1个5,4个1,但是用dp就可以知道 ...

题目说要cover1到9,我请问你1你如何cover?

补充内容 (2017-2-5 22:54):
“比如9,【5, 3, 1】用greedy就是1个5,4个1,但是用dp就可以知道是3个3”

你这个情况用greedy应该是2个1,1个3,1个5
回复

使用道具 举报

🔗
shameka0425 2017-2-11 01:16:01 | 只看该作者
全局:
我的理解是m肯定能用它给的硬币拼出来,让我们找一个用硬币数最少的解法,如果要找出所有解法来估计要用dfs了
我用DP写了一下, prev里面保存了上次用的硬币

  1. #include <vector>
  2. #include <climits>
  3. #include <unordered_map>
  4. #include <iostream>
  5. using namespace std;

  6. unordered_map<int,int> coinChanging(vector<int> coins, int m) {
  7.         vector<int> dp(m+1, 0), prev(m+1, 0);
  8.         dp[0] = 0;
  9.         for (int i = 1; i <= m; ++i) {
  10.                 dp[i] = INT_MAX;
  11.                 for (int j = 0; j < coins.size() && i >= coins[j]; ++j) {
  12.                         if (dp[i-coins[j]]+1 < dp[i]) {
  13.                                 dp[i] = dp[i-coins[j]]+1;
  14.                                 prev[i] = coins[j];
  15.                         }
  16.                 }
  17.         }
  18.         cout << "min coins used: " << dp[m] << endl;
  19.         unordered_map<int,int> res;
  20.         int cur = m;
  21.         while (cur != 0) {
  22.                 ++res[prev[cur]];
  23.                 cur -= prev[cur];
  24.         }
  25.         return res;
  26. }


  27. int main() {
  28.         vector<int> coins = {1,2,21,25};
  29.         for (auto& a: coinChanging(coins, 63)) {
  30.                 cout << "coin " << a.first << ": " << a.second << endl;
  31.         }
  32.         for (auto& a: coinChanging({1,3,5}, 9)) {
  33.                 cout << "coin " << a.first << ": " << a.second << endl;
  34.         }
  35.         for (auto& a: coinChanging({1,5}, 9)) {
  36.                 cout << "coin " << a.first << ": " << a.second << endl;
  37.         }
  38.         for (auto& a: coinChanging({1,5}, 10)) {
  39.                 cout << "coin " << a.first << ": " << a.second << endl;
  40.         }
  41.         return 0;
  42. }
复制代码
回复

使用道具 举报

🔗
jiaguofang 2017-2-11 01:39:33 | 只看该作者
全局:
至少有一枚硬币价值1,不然1本身无法表示。
有了这个,f(n)转化为价值为1的硬币和dp(n-1)。然后dp(n-1)用传统的dp。此时不再受1...m都可以表示的限制,因为有了1。

补充内容 (2017-2-11 02:15):
我想错了,请自动忽略我的回复。不好意思
回复

使用道具 举报

🔗
jiaguofang 2017-2-11 01:43:03 | 只看该作者
全局:
其实dp(n-1)可以不用dp,贪心就可以?

补充内容 (2017-2-11 02:16):
我想错了,请自动忽略我的回复。不好意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表