🎁 长周末专享特惠!VIP通行证6个月立减$50,蓝莓立减$25 🎁
查看: 3157| 回复: 4
收起左侧

Google : Find the number of duplicated number in sorted array

wwwyhx | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Given a sorted array and a number n.How can u find the
number of occurance of n in the array . should be o(logn)

简单题.

上一篇:Google : Link addition
下一篇:Amazon : implement binary tree leaf iterator
darksteel 2011-7-29 13:47:32 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   32
100%
0%
0
两次二分找上下界
回复

使用道具 举报

 楼主| wwwyhx 2011-7-30 09:05:11 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   177
88%
12%
25
两次二分找上下界
darksteel 发表于 2011-7-29 13:47


正确

  1. int FindSide(int a[], int n, int num, bool bLeft)
  2. {
  3.         assert(a && n > 0);

  4.         int nBeg = 0;
  5.         int nEnd = n-1;
  6.         int nPos = -1;

  7.         while (nBeg <= nEnd)
  8.         {
  9.                 int nMid = (nBeg + nEnd)/2;
  10.                 if (a[nMid] == num)
  11.                 {
  12.                         nPos = nMid;
  13.                         if (bLeft)
  14.                                 nEnd = nMid - 1;
  15.                         else
  16.                                 nBeg = nMid + 1;
  17.                 }
  18.                 else if (a[nMid] < num)
  19.                         nBeg = nMid + 1;
  20.                 else
  21.                         nEnd = nMid - 1;
  22.         }

  23.         return nPos;
  24. }

  25. int GetNum(int a[], int n, int num)
  26. {
  27.         assert(a && n > 0);

  28.         int l = FindSide(a, n, num, true);
  29.         if (l < 0) return 0;

  30.         int r = FindSide(a, n, num, false);

  31.         return r - l + 1;
  32. }
复制代码
回复

使用道具 举报

Yunia 2012-7-16 14:06:55 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   1
100%
0%
0
是不是一次二分也行呢?
  1. int getCount(int A[], int nLeft, nRight, int n)
  2. {
  3.          if (nLeft == nRight)
  4.                  return A[nLeft] == n ? 1 : 0;

  5.          int nMid = (nLeft + nRight) /2;
  6.          if (A[nMid] == n)
  7.            return getCount(A, nLeft, nMid - 1,n) + getCount(A, nMid + 1, nRight,n) + 1;
  8.          else if (A[nMid] > n)
  9.                  return getCount(A, nLeft, nMid -1, n );
  10.          else
  11.                  return getCount(A, nMid+1, nRight,n);
  12. }
复制代码

回复

使用道具 举报

defjex 2012-7-24 16:10:56 | 显示全部楼层
本楼:   👍  0
0%
0%
0   👎
全局:   55
100%
0%
0
Yunia 发表于 2012-7-16 14:06
是不是一次二分也行呢?

你这个不能算作“一次二分”。 因为你的递归树里可能有二叉 (第8行)。  他们的代码每一次递归都是严格一插到底LogN。
回复

使用道具 举报

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

本版积分规则

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