【劍指offer中等部分12】數字在升序陣列中出現的次數(java)
阿新 • • 發佈:2020-12-19
目錄
題目描述
統計一個數字在升序陣列中出現的次數。
分析
兩個方法,第一個暴力破解,也就是我們最容易想到的遍歷整個陣列即可,這樣陣列長度為n的話,時間複雜度即為O(n),另一個是二分法,因為給定的陣列為有序陣列。
一、暴力破解
程式碼如下:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//常規解法:時間複雜度為O(n)
int count = 0;
for(int i = 0 ; i < array.length ; i++){
if(array[i] == k){
count++;
}
}
return count;
}
}
二、二分法
二分法時間複雜度為O(logn)
2.1 二分法思路1
尋找k出現的上下界
中間過程自己可以試著自己推導一下,影響會更深刻噢。
程式碼如下:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
// 尋找上界leftBound
int left = 0, right = array.length;
while(left<right){
int mid = (right + left)/2;
if(array[mid]<k) left = mid+1;
else right=mid;
}
int leftBound = left;
// 尋找下界rightBound
left = 0;
right = array.length;
while(left<right){
int mid = (right + left)/2;
if(array[mid]<=k) left = mid+1;
else right = mid;
}
int rightBound = left;
return rightBound-leftBound;
}
}
2.2 二分法思路2
找到第一個出現k的下標後,分別往這個數的左右找還有幾個和k相等的數。
程式碼如下:
import java.util.Arrays;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int index = Arrays.binarySearch(array,k);
int count = 1;
if(index < 0)
return 0;
//index下標右邊是否也有與k相等的數,有則count++
for(int i = index + 1 ; i < array.length;i++){
if(array[i] == k)
count ++;
else
break;
}
//index下標左邊是否也有與k相等的數,有則count++
for(int j = index - 1;j >= 0 ;j--){
if(array[j] == k)
count ++;
else
break;
}
return count;
}
}