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

Google Phone 9/30

🔗
yhl 2016-10-2 03:50:21 | 只看该作者
全局:
试试看对吗?..

int maxGap(vector<int> nums)
{
   vector<int> min(nums.size(), INT_MAX);
   int minIndex = 0, maxGap = 0;

   for (int i = 0; i < nums.size(); i++)
   {
      if (nums[i] <= nums[minIndex])
      {
         minIndex = i;
      }
      min[i] = minIndex;
   }

   int r = nums.size() - 1;

   while (r >= 0)
   {
      int tmp = r;

      while (tmp > 0 && nums[r] > nums[min[tmp]])
      {
         maxGap = max(maxGap, r - min[tmp] + 1);
         tmp = min[tmp] - 1;
      }

      if (r == tmp)
         break;

      r = tmp;
   }

   return maxGap;
}
回复

使用道具 举报

🔗
rcholic 2016-10-2 03:52:44 | 只看该作者
全局:
用dynamic programming的思路写了一个,测试结果正确,但是空间O(n), 时间复杂度貌似是O(n^2)了:(

  1. public int maxDistance2(int[] A) {
  2.         if(A.length < 2) {
  3.             return 0;
  4.         }

  5.         int n = A.length;
  6.         int[] dp = new int[n];
  7.         dp[0] = 0;
  8.         for (int i = 1; i < n; i++) {
  9.             int curMinIndex = minIndex(A, i);// < i ? 1 : 0; // TODO: this is not working yet
  10.             dp[i] = Math.max(dp[i-1], curMinIndex);
  11.         }

  12.         System.out.println(Arrays.toString(dp));

  13.         return dp[n-1];
  14.     }

  15.     // find the minimum index where nums[i] <= nums[curPos]
  16.     private int minIndex(int[] nums, int curPos) {
  17.         int result = curPos;
  18.         int k = curPos-1;
  19.         while (k >= 0) {
  20.             if (nums[k] <= nums[curPos]) {
  21.                 result = k;
  22.             }
  23.             k--;
  24.         }

  25.         return curPos - result;
  26.     }
复制代码

补充内容 (2016-10-2 03:55):
// find the minimum index where nums[i] <= nums[curPos]
应该改为
// find the max distance between the current position and the element that satisfies A[i] <= A[curPos]
回复

使用道具 举报

🔗
木易wen 2016-10-2 04:06:48 | 只看该作者
全局:
lz能上一下代码么?只想到了O(nlgn)解法, 想看一下你怎么做的,谢谢
回复

使用道具 举报

🔗
rcholic 2016-10-2 04:06:51 | 只看该作者
全局:
不好意思,刷屏了,刚又试了一下双指针的做法,貌似也是正确的,时间O(n),不用空间

  1. public int maxDistance3(int[] A) {
  2.         if(A.length < 2) {
  3.             return 0;
  4.         }
  5.         int max = 0;

  6.         int left = 0, right = A.length - 1;
  7.         while (left < right) {
  8.             if (A[left] <= A[right]) {
  9.                 max = Math.max(max, right-left);
  10.                 right--;
  11.             } else {
  12.                 left++;
  13.             }
  14.         }

  15.         return max;
  16.     }
复制代码


test cases:

  1. []
  2. [1, 10, 6]
  3. [1, 10, 6, 3, 2, 3, 4, 5, 6]
  4. [6, 1, 10, 6, 3, 2, 3, 4, 5, 6]
  5. [100, 6, 1, 10, 6, 3, 2, 3, 4, 5, 6]
复制代码


跑步去鸟。。。。
回复

使用道具 举报

🔗
木易wen 2016-10-2 04:10:14 | 只看该作者
全局:
rcholic 发表于 2016-10-2 03:52
用dynamic programming的思路写了一个,测试结果正确,但是空间O(n), 时间复杂度貌似是O(n^2)了:( ...

n2就不用dp了。。直接全扫一遍找最大
回复

使用道具 举报

🔗
 楼主| ericlee27 2016-10-2 04:12:03 | 只看该作者
全局:
木易wen 发表于 2016-10-2 04:10
n2就不用dp了。。直接全扫一遍找最大

我晚上回家贴哈
回复

使用道具 举报

🔗
rcholic 2016-10-2 04:19:54 | 只看该作者
全局:
其实这个题可以转化成一个这样的题目:
假设你的数组是: A =[10, 2, 6, 1, 4, 5, 6

将这个数组做成prefix diff: D = A[i] - A[i-1] (for i > 0), 转化成这个 D = [0, -8, 4, -5, 3, 1, 1]

题目相当于问在D数组中找出sum为0的区间长度,上面加粗体的部分即为答案!和best time to buy and sell stocks那个题差不多,只不过是问法变了

补充内容 (2016-10-2 04:20):
更正:D = A[i] - A[i-1] (for i > 0)
回复

使用道具 举报

🔗
WhatsFLAG 2016-10-2 04:21:30 | 只看该作者
全局:
rcholic 发表于 2016-10-2 04:06
不好意思,刷屏了,刚又试了一下双指针的做法,貌似也是正确的,时间O(n),不用空间

看了代码还是不敢苟同啊,比如2,3,1?
回复

使用道具 举报

🔗
木易wen 2016-10-2 04:23:00 | 只看该作者
全局:
yhl 发表于 2016-10-2 03:50
试试看对吗?..

int maxGap(vector nums)

[2, 1, 4, 5, 3, 0, 6, 7, 1, 1]这个不对,应该是8
回复

使用道具 举报

🔗
rcholic 2016-10-2 04:23:05 | 只看该作者
全局:
WhatsFLAG 发表于 2016-10-2 04:21
看了代码还是不敢苟同啊,比如2,3,1?

[2,3,1], yeah you got me
回复

使用道具 举报

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

本版积分规则

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