码迷,mamicode.com
首页 > 编程语言 > 详细

37数字在排序数组中出现的次数

时间:2018-01-01 23:44:07      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:pos   排序   大于   一个   get   for   return   个数   nbsp   

 

 

题目描述

统计一个数字在排序数组中出现的次数

思路1:暴力循环 O(N)

public class Solution {
public int GetNumberOfK(int [] a, int k) {
int cnt=0;
for(int i=0;i<a.length;i++)
if(a[i]==k)
cnt++;
return cnt;
}
}

思路2:利用二分查找 O(logN)

利用二分查找 找到所求数字第一次出现的位置与最后出现的位置。
2个位置差就是次数。

利用2分查找找到第一个k(所求的数),拿K与数组中间的数字相比,如果K大,则去后半部分找;
如果K小,则去前半部分找,如果相等,判断当前的K是不是第一次出现。 (如果K等于K前面的数字,则不是第一次出现,如果K大于K前面的数字,则是第一次出现),如果K不是第一次出现,则去K前面继续找,如果是第一次出现,则找到了位置。



 1 public class Solution {
 2         public int GetNumberOfK(int [] a, int k) {
 3             if(a.length==0) return 0;
 4             int f = GetFirstK(a, k);
 5             int l = GetLstK(a,k);
 6             if(a[f]==k && a[l]==k)
 7                 return  l-f+1;
 8             else
 9                 return 0;
10         }
11     
12         private int GetFirstK(int a[],int k) {
13             
14             int lo = 0,hi=a.length-1;
15             int mid  =0;
16             while(true) {
17                 if(lo>=hi) return hi;
18                   mid  = (hi-lo)/2+lo;
19                  if(k<a[mid])
20                      hi=mid-1;
21                  else if(k>a[mid]){
22                      lo=mid+1;
23                 }
24                  else {
25                     if(mid-1>=lo&&a[mid-1]==k)
26                         hi = mid-1;
27                     else
28                         return mid;                    
29                 }
30             }       
31         }
32     private int GetLstK(int a[],int k) {
33             
34             int lo = 0,hi=a.length-1;
35             int mid = 0;
36             while(true) {
37                 if(lo>=hi) return lo;
38                  mid  = (hi-lo)/2+lo;
39                  if(k<a[mid])
40                      hi=mid-1;
41                  else if(k>a[mid]){
42                      lo=mid+1;
43                 }
44                  else {
45                     if(mid+1<=hi&&a[mid+1]==k)
46                         lo = mid+1;
47                     else
48                         return mid;    
49                 }
50             }    
51         }
52     
53     
54     
55 }

 

37数字在排序数组中出现的次数

标签:pos   排序   大于   一个   get   for   return   个数   nbsp   

原文地址:https://www.cnblogs.com/zle1992/p/8168887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!