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

fb onsite 这样“黑”的我真的很不舒服

🔗
cuiyi 2016-11-21 08:41:15 | 只看该作者
全局:
mysteryjoe 发表于 2016-10-28 10:38
4sum average应该没有n2logn的吧,看过很多自称n2logn的方法,分析都是至少n3的

理论上O(n^2)可以做,把所有(x,y) pair的和放到hash table里面,看有没有两个pair加起来是target。K sum的理论复杂度是O(n^(K+1)/2)
回复

使用道具 举报

🔗
FTD2014 2016-12-7 03:47:37 | 只看该作者
全局:
楼主能具体说说设计题那道怎么做的吗,谢谢!
回复

使用道具 举报

🔗
bigbearlake 2017-4-26 11:57:11 | 只看该作者
全局:
写了下代码
  1. public class Four4SumFastest {

  2.     class Pair {
  3.         int i;
  4.         int j;
  5.         int sum;
  6.         public Pair(int i, int j, int sum) {
  7.             this.i = i;
  8.             this.j = j;
  9.             this.sum = sum;
  10.         }
  11.     }

  12.     public List<int[]> findFourElements(int[] arr, int k) {
  13.         List<int[]> res = new ArrayList<>();
  14.         if (arr == null || arr.length < 4) {
  15.             return res;
  16.         }

  17.         int n = arr.length;
  18.         Arrays.sort(arr);
  19.         List<Pair> list = new ArrayList<>();
  20.         for (int i = 0; i < n - 1; i ++) {
  21.             for (int j = i + 1; j < n; j++) {
  22.                 list.add(new Pair(i, j, arr[i] + arr[j]));
  23.             }
  24.         }

  25.         Collections.sort(list, new Comparator<Pair>() {
  26.             public int compare(Pair p1, Pair p2) {
  27.                 return p1.sum - p2.sum;
  28.             }
  29.         });
  30.         
  31.         int i = 0;
  32.         int j = list.size() - 1;
  33.         HashSet<String> set = new HashSet<>();
  34.         while (i < j) {
  35.             int sum = list.get(i).sum + list.get(j).sum;
  36.             if (sum == k && nonCommon(list.get(i), list.get(j))) {
  37.                 int[] tmp = new int[4];
  38.                 tmp[0] = arr[list.get(i).i];
  39.                 tmp[1] = arr[list.get(i).j];
  40.                 tmp[2] = arr[list.get(j).i];
  41.                 tmp[3] = arr[list.get(j).j];
  42.                 Arrays.sort(tmp);
  43.                 String key = tmp[0] + " " + tmp[1] + " " + tmp[2] + " " + tmp[3];
  44.                 if (!set.contains(key)) {
  45.                     res.add(new int[] {arr[list.get(i).i], arr[list.get(i).j], arr[list.get(j).i], arr[list.get(j).j]});
  46.                     set.add(key);
  47.                 }
  48.                 i++;
  49.                 j--;
  50.             } else if (sum > k) {
  51.                 j--;
  52.             } else {
  53.                 i++;
  54.             }
  55.         }

  56.         return res;
  57.     }

  58.     private boolean nonCommon(Pair p1, Pair p2) {
  59.         if (p1.i == p2.i || p1.i == p2.j || p1.j == p2.j || p1.j == p2.i) {
  60.             return false;
  61.         }

  62.         return true;
  63.     }

  64.     public static void main(String[] args) {
  65.         int[] arr = {10, 2, 3, 4, 5, 9, 7, 8, 7, 8, 2, 2, 7, 7};
  66.         Four4SumFastest f = new Four4SumFastest();
  67.         List<int[]> res = f.findFourElements(arr, 23);
  68.         for (int[] tmp : res) {
  69.             String key = tmp[0] + " " + tmp[1] + " " + tmp[2] + " " + tmp[3];
  70.             System.out.println(key);
  71.         }
  72.     }
  73. }
复制代码
回复

使用道具 举报

🔗
hakusama1024 2017-5-25 09:33:34 | 只看该作者
全局:

我去。。。这一会就得写这么多代码啊。。。
回复

使用道具 举报

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

本版积分规则

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