📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
楼主: mameko
跳转到指定楼层
上一主题 下一主题
收起左侧

非死不可面筋

🔗
jerryfu823 2017-5-23 14:09:55 | 只看该作者
全局:
楼主好运,东方不亮西方亮。
回复

使用道具 举报

🔗
say543 2017-5-23 15:04:51 | 只看该作者
全局:
觉得楼主的time complexity 没有错 dfs index recurison 维持同一个index 然后 每一次选择要去重 dp 这个能做吗? 用backtracking 感觉能做 但是颇麻烦...
回复

使用道具 举报

全局:
如果真是国人面试官,可能还有一点过得希望吧


就是dfs啊,然后每次recursive的时候指针不+1

复杂度我也赞成m^n
不过这个m^n是有点粗犷的,可以更加准确
回复

使用道具 举报

🔗
niejunhong 2017-5-23 18:13:43 | 只看该作者
全局:
say543 发表于 2017-5-23 15:04
觉得楼主的time complexity 没有错 dfs index recurison 维持同一个index 然后 每一次选择要去重 dp 这个能 ...

去重其实你在做dfs之前先给数组去重自然在做dfs的时候就不用考虑了
回复

使用道具 举报

🔗
hxuanyu 2017-5-23 18:43:48 | 只看该作者
全局:
lz这个就是combination sum 1 + 2 啊

我写了下
  1.     void perm(vector<int>& nums, int pos, int target, vector<int>& temp, vector<vector<int>>& rslt) {
  2.         if (target == 0) {
  3.             rslt.push_back(temp);
  4.         } else if (target < 0) {
  5.             return;
  6.         }
  7.         
  8.         for (int i = pos; i < nums.size();) {
  9.             temp.push_back(nums[i]);
  10.             perm(nums, i, target - nums[i], temp, rslt);
  11.             temp.pop_back();
  12.             
  13.             int p = i;
  14.             while ((nums[p] == nums[i]) && (p < nums.size())) p++;
  15.             i = p;
  16.         }
  17.     }
复制代码


输入{1, 1, 1, 1, 2, 3}, target = 5的结果是
  1. 1, 1, 1, 1, 1,
  2. 1, 1, 1, 2,
  3. 1, 1, 3,
  4. 1, 2, 2,
  5. 2, 3,
复制代码
回复

使用道具 举报

🔗
 楼主| mameko 2017-5-23 21:00:58 | 只看该作者
全局:
sfsttz 发表于 2017-5-23 08:43
他问“target大小是m,数组长度是n” 可能说明他想要dp做法

求所有解,不能DP,要深搜
回复

使用道具 举报

🔗
 楼主| mameko 2017-5-23 21:10:50 | 只看该作者
全局:
嘛,总体来说不难,就是一时脑残:

  1. public List<List<Integer>> combinationSum2(int[] candidates, int target) {
  2.                 List<List<Integer>> res = new ArrayList<>();
  3.                 if (candidates == null || candidates.length == 0) {
  4.                         return res;
  5.                 }

  6.                 ArrayList<Integer> tmp = new ArrayList<>();
  7.                 dfsHelper(tmp, res, target, 0, candidates);

  8.                 return res;
  9.         }

  10.         private void dfsHelper(ArrayList<Integer> tmp, List<List<Integer>> res, int target, int start, int[] candidates) {
  11.                 if (target == 0) {
  12.                         res.add(new ArrayList<>(tmp));
  13.                         return;
  14.                 }

  15.                 for (int i = start; i < candidates.length; i++) {
  16.                         if (i != start && candidates[i] == candidates[i - 1]) {
  17.                                 continue;
  18.                         }

  19.                         if (candidates[i] > target) {
  20.                                 break;
  21.                         }

  22.                         tmp.add(candidates[i]);
  23.                         dfsHelper(tmp, res, target - candidates[i], i, candidates);
  24.                         tmp.remove(tmp.size() - 1);
  25.                 }
  26.         }
复制代码
回复

使用道具 举报

🔗
dzl199401 2017-5-23 21:46:12 | 只看该作者
全局:
lc上有一篇关于此类题目的总结很好,都是backtracking
https://discuss.leetcode.com/topic/46159/a-general-approach-to-backtracking-questions-in-java-subsets-permutations-combination-sum-palindrome-partitioning
回复

使用道具 举报

🔗
edyyy 2017-5-23 23:15:40 | 只看该作者
全局:
谢谢分享
楼主好运啊!!
回复

使用道具 举报

🔗
houqingniao 2017-5-23 23:50:05 | 只看该作者
全局:
bless LZ. 这个跟LC的combination(可以重复取值那道)有啥区别啊?感觉是一样啊
回复

使用道具 举报

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

本版积分规则

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