剑指offer——数组在排序数组中出现的次数

题目链接:统计一个数字在排序数组中出现的次数。

解题思路:

由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置

这里有一个大坑:&&这个符号非常坑爹,&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;所以总是提示数组越界就是在这里!!!!。

 1 public class Solution {
 2     public int GetNumberOfK(int [] array , int k) {
 3         int first = getFirstK(array,k);
 4         int end = getLastK(array,k);
 5         int num = 0;
 6         if(first > -1 && end > -1){
 7              num = end - first + 1;
 8             return num;
 9         }
10         return num;
11     }
12     
13     public  int getFirstK(int[] array,int k){
14         int start = 0;
15         int end = array.length-1;
16         while(start<=end){
17             int mid=(start+end)/2;
18             if(k<array[mid])
19                 end=mid-1;
20             else if(k>array[mid])
21                 start=mid+1;
22             else{
23                 if((mid>0&&array[mid-1]!=k)||mid==0)
24                     return mid;
25                 else{
26                     end=mid-1;
27                 }
28             }
29         }
30         return -1;
31     }
32      
33     public  int getLastK(int[] array,int k){
34         int start = 0;
35         int end = array.length-1;
36         while(start<=end){
37             int mid=(start+end)/2;
38             if(k<array[mid])
39                 end=mid-1;
40             else if(k>array[mid])
41                 start=mid+1;
42             else{
43                 if((mid<array.length-1&&array[mid+1]!=k)||mid==array.length-1)
44                     return mid;
45                 else{
46                     start=mid+1;
47                 }
48             }
49         }
50         return -1;
51     }
52     
53 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10873934.html