楼主: mwsak47
跳转到指定楼层
上一主题 下一主题
收起左侧

Google 新鲜面筋

🔗
simplessssss 2016-3-4 12:26:06 | 只看该作者
全局:
我觉得第一条是不是应该用动归去做 dp[n][k][2], 分别表示前n个数中k个数的乘积的最大值域做小值。这样时间复杂度是O(nk)的。
回复

使用道具 举报

🔗
kidzlike 2016-3-4 12:30:15 | 只看该作者
全局:
hesha0987 发表于 2016-2-26 07:31
priority_queue 的复杂度和sort是一样的吧?都是nlogn。
并且priority_queue的话 需要用一个min heap 和 ...

用pq是nlogk
回复

使用道具 举报

🔗
Wrath 2016-3-9 05:44:17 | 只看该作者
全局:
googlerr 发表于 2016-2-26 11:45
应该是Queue里面只放K个元素,一个里面放最大的K个,另一个里面放最小的K个

这样之后该怎么办呢?把minHeap和maxHeap各自的K个数乘起来比较乘积大小?但是还得考虑一部分数来自minHeap一部分数来自maxHeap的情况啊,感觉很复杂……
回复

使用道具 举报

🔗
sheepmiemies 2016-3-15 12:23:10 | 只看该作者
全局:
Wrath 发表于 2016-3-9 05:44
这样之后该怎么办呢?把minHeap和maxHeap各自的K个数乘起来比较乘积大小?但是还得考虑一部分数来自minHe ...

确实,情况是挺复杂的,先撇开overflow的话,还得考虑有0的情况
回复

使用道具 举报

🔗
wrf91324 2016-3-15 23:54:44 | 只看该作者
全局:
第一题:
Brute Force : O(n2)
Sort: O(nlogn)
指针遍历: O(n)
找FirstMax, SecondMax, FirstMin, SecondMin,
求 Math.max(FirstMax* SecondMax, FirstMin * SecondMin)
(数组情况很多, 有可能只有1个负数,多个负数,没有负数 一个负数自然就去Math.max里边的前者了,多个有可能是后者,没有负数也是前者)

Follow Up:
维护两个大小为k的heap,一个是maxheap,一个是misheap,
每次加入的时间复杂度是 O(logk)
遍历一遍,把每个数都加入两个heap, N次
最后时间复杂度是O(nlogk)
(判断的时候情况还很多,比如两个负数相乘为正,所以可以取一堆成对的负数和正数组合)
回复

使用道具 举报

🔗
mrhohn 2016-3-16 05:09:44 | 只看该作者
全局:
看了下第一题的follow up上升到K个数的最大值,觉得大家说的两个heap好像挺可行的,试着写了一个,不过最后取pair写得太繁杂了:(
  1. <blockquote>import java.util.*;
复制代码
回复

使用道具 举报

🔗
mrhohn 2016-3-16 05:14:59 | 只看该作者
全局:
  1. import java.util.*;

  2. public class MultiK {
  3.     // assume input nums is valid -> nums.length >= k
  4.     // not consider overflow
  5.     public static int multiK(int[] nums, int k) {
  6.     <span style="line-height: 1.5;">   </span><span style="line-height: 1.5;"> </span><span style="line-height: 1.5;">if (nums.length == k) {</span>
复制代码
不知道这次能发出来不



回复

使用道具 举报

🔗
mrhohn 2016-3-16 05:20:15 | 只看该作者
全局:
至今不懂怎么贴代码…打扰各位了orz
  1. import java.util.*;

  2. public class MultiK {
  3.     // assume input nums is valid -> nums.length >= k
  4.     // not consider overflow
  5.     public static int multiK(int[] nums, int k) {
  6.         if (nums.length == k) {
  7.             int res = 1;
  8.             for (int n : nums) {
  9.                 res *= n;
  10.             }
  11.             return res;
  12.         }

  13.         // minHeap saves the k biggest numbers
  14.         PriorityQueue<Integer> minHeap = new PriorityQueue<>();
  15.         // maxHeap saves the k smallest numbers
  16.         PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> (b - a));
  17.         int max = Integer.MIN_VALUE;
  18.         for (int n : nums) {
  19.             max = Math.max(max, n);
  20.             // maintain minHeap and maxHeap both with k number
  21.             minHeap.offer(n);
  22.             if (minHeap.size() > k) {
  23.                 minHeap.poll();
  24.             }
  25.             maxHeap.offer(n);
  26.             if (maxHeap.size() > k) {
  27.                 maxHeap.poll();
  28.             }
  29.         }

  30.         int res = 1;
  31.         // check special cases
  32.         // if all negatives, and k is odd
  33.         // result would be negative, choose from biggest k
  34.         if (max < 0 && k % 2 == 1) {
  35.             while (!minHeap.isEmpty()) {
  36.                 res *= minHeap.poll();
  37.             }
  38.             return res;
  39.         }

  40.         // otherwise the result would be >= 0
  41.         // convert heaps to sorted list
  42.         int[] minK = new int[k];
  43.         int[] maxK = new int[k];
  44.         for (int i = k - 1; i >= 0; --i) {
  45.             minK[i] = maxHeap.poll();
  46.             maxK[i] = minHeap.poll();
  47.         }

  48.         int minPos = 0, maxPos = 0;
  49.         // if k is odd, poll the largest non-negative first
  50.         if (k % 2 == 1) {
  51.             --k;
  52.             res *= maxK[maxPos];
  53.             ++maxPos;
  54.         }
  55.         // now choose k/2 pairs out of heap
  56.         while (k != 0) {
  57.             int minPair = minK[minPos] * minK[minPos + 1];
  58.             int maxPair = maxK[maxPos] * maxK[maxPos + 1];
  59.             if (maxPair > minPair) {
  60.                 res *= maxPair;
  61.                 maxPos += 2;
  62.             }
  63.             else {
  64.                 res *= minPair;
  65.                 minPos += 2;
  66.             }
  67.             k -= 2;
  68.         }

  69.         return res;
  70.     }

  71.     public static void main(String[] args) {
  72.         int[] test1 = {-8, -7, -3, -1, 0, 5, 6, 9};
  73.         int k = 3;
  74.         System.out.println("test1: " + MultiK.multiK(test1, k));

  75.         int[] test2 = {-8, -7, -3, -1, 0, 5, 6, 9};
  76.         k = 2;
  77.         System.out.println("test2: " + MultiK.multiK(test2, k));

  78.         int[] test3 = {-8, -7, -3, -1};
  79.         k = 3;
  80.         System.out.println("test3: " + MultiK.multiK(test3, k));

  81.         int[] test4 = {1, 2, 3, 5, 6, 9};
  82.         k = 4;
  83.         System.out.println("test4: " + MultiK.multiK(test4, k));

  84.         int[] test5 = {-8, -7, -3, -1, 0, 5, 6, 9};
  85.         k = 7;
  86.         System.out.println("test5: " + MultiK.multiK(test5, k));
  87.     }
  88. }
复制代码
回复

使用道具 举报

🔗
bobzhang2004 2016-3-31 12:32:12 | 只看该作者
全局:
googlerr 发表于 2016-2-26 11:45
应该是Queue里面只放K个元素,一个里面放最大的K个,另一个里面放最小的K个

你说的queue是指PriorityQueue吧,就是一个maxHeap, 一个minHeap?
回复

使用道具 举报

🔗
bobzhang2004 2016-3-31 12:32:22 | 只看该作者
全局:
googlerr 发表于 2016-2-26 11:45
应该是Queue里面只放K个元素,一个里面放最大的K个,另一个里面放最小的K个

你说的queue是指PriorityQueue吧,就是一个maxHeap, 一个minHeap?
回复

使用道具 举报

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

本版积分规则

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