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

脸家加面,似乎他家最近新题很多?

🔗
pomme2016 2017-8-5 13:28:45 | 只看该作者
全局:
edyyy 发表于 2017-8-5 11:00
数一数有多少个子集(subset)使得子集里面的最大元素加上最小元素小于K。
A: [2, 3, 5, 7]  K: 8
=> #  ...

3+3<8
所以应该是一个
回复

使用道具 举报

🔗
pomme2016 2017-8-5 14:04:35 | 只看该作者
全局:
stealop 发表于 2017-8-4 22:34
双指针做不了吧, 需要 递归
比如 k = 10

这题感觉是subset变形。
1 2 3 8的 1+8<10的时候 2^3 = 8是有8个subset 1, 1 2, 1 3, 1 8, 1 2 3, 1 2 8, 1 3 8, 1 2 3 8
然后下一个2 + 3<10 的时候 2个解 2, 2 3
然后是 3 + 3 <10 的时候 3 一个解
一共11个subsets
回复

使用道具 举报

🔗
pomme2016 2017-8-5 14:30:06 | 只看该作者
全局:
scredwood 发表于 2017-8-4 13:13
如果你实在想双指针,那么就先预处理把重复去掉咯。。。

有重复的情况
预先处理掉的话, 2 3 3 5
3的重复可以去掉,但是会漏掉 2 3 3,2 3 3 5, 3 3这几个答案。
是不是有重复的时候 我们就要把 subset用backtracking找到具体不重复答案有几个?
回复

使用道具 举报

🔗
密码 2017-8-6 12:15:32 | 只看该作者
全局:
LZ面的是哪个组?是那个做business app的组吗?
回复

使用道具 举报

🔗
Darkduke68 2017-8-6 13:25:45 | 只看该作者
全局:
真淘蛮 发表于 2017-8-5 13:17
循环内得再加一个判断吧?
if (i  == j) {
if (s < k) res++;

不需要加吧,while (i <= j) 已经把单一元素的情况包括了。 详情看下楼的code, 一个意思。

补充内容 (2017-8-6 13:26):
30楼的code
回复

使用道具 举报

🔗
mameko 2017-8-6 21:12:37 | 只看该作者
全局:
twosumii 发表于 2017-8-5 00:28
哈哈,可是你拿了offer我挂了,呜呜

我刚好碰到做过的题,比较幸运而已。
回复

使用道具 举报

🔗
真淘蛮 2017-8-6 21:44:06 | 只看该作者
全局:
pomme2016 发表于 2017-8-5 13:27
我自己想一开始用的DP,然后发现真的可以双指针呢。
感觉下面写的代码是对的,跑了几个test case

当 i == j 时, if (nums[i] + nums[j] < K) 要转化成 if (nums[i]  < K) 吧
回复

使用道具 举报

🔗
真淘蛮 2017-8-6 21:46:45 | 只看该作者
全局:
Darkduke68 发表于 2017-8-6 13:25
不需要加吧,while (i

nums = { 1}, k = 2 呢, 30楼的code , 跑完是0?
回复

使用道具 举报

全局:
第二题双指针是可以,但是不能简单数学方法算subset,会有很多重复的啊。。。
回复

使用道具 举报

全局:
自己写的,比较直接的解法:
  1. import java.util.*;

  2. // 给一个排序好的数组,数一数有多少个子集(subset)使得子集里面的最大元素加上最小元素小于K。
  3. // A: [2, 3, 5, 7]  K: 8
  4. // => # of subsets S: Max(S) + Min(S) < K.
  5. // => [2] , [2, 3], [2, 5], [2, 3, 5], [3] => #: 5

  6. class LessThanK{
  7.     public static void main(String[] args) {
  8.         int[] nums = {2,3,3, 5, 7};
  9.         int k = 8;
  10.         LessThanK test = new LessThanK();
  11.         int res = test.getNumber_noDuplicate(nums, k);
  12.         System.out.println(res);
  13.       
  14.         System.out.println("Backtracking Way:");
  15.       
  16.         int res2 = test.getNumber_dfs_Duplicate(nums, k);
  17.         System.out.println(res2);
  18.     }

  19.     // ========= if No Duplicate ===========
  20.     public int getNumber_noDuplicate(int[] nums, int k) {
  21.         int cnt = 0;
  22.         int i = 0, j = nums.length - 1;

  23.         while (i <= j) {
  24.             if (nums[i] + nums[j] < k) {
  25.                 cnt += (int) Math.pow(2, j - i);
  26.                 i++;
  27.             } else {
  28.                 j--;
  29.             }
  30.         }

  31.         return cnt;
  32.     }

  33.     // ========= With Dulicate, like Combination Sum II  ========= :
复制代码

补充内容 (2017-8-6 09:42):
next page (cont..)
回复

使用道具 举报

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

本版积分规则

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