題目描述:
統計乙個數字在排序陣列中出現的次數。
如輸入排序陣列和數字3,由於3在陣列中出現了 4 次,因此輸出4.
解析:
在有序陣列中查詢乙個數可以聯想到二分查詢。
如例子中,要查詢3的次數,二分查詢,找到3後,它的左右兩邊可能都有3,因此兩邊都要查詢,如果3在陣列中出現了n次,則時間複雜度o(n),二分查詢沒有起到作用。
假設我們要在陣列中查詢 k 的次數。因為陣列是有序的,那麼只要找到陣列中的第乙個 k 和最後乙個 k就能夠確定出現的次數。
我們不必查詢到每乙個 k ,只需查詢 2 個 k ,因此時間複雜度 o(logn)。
#include
using
namespace
std;
int getfirstk(int nums, int start, int end, int k) else
if (nums[mid] > k) else
return firstk;
}int getlastk(int nums, int start, int end, int k) else
if (nums[mid] < k) else
return lastk;
}int getcountsofk(int nums, int start, int end, int k)
int main() ;
int k = 4;
cout
<< getcountsofk(nums, 0, sizeof(nums)/sizeof(nums[0])-1, k) << endl;
}
Q38 數字在排序陣列中出現的次數
public class q38數字在排序陣列中出現的次數 system.out.println test.getnumberofk array,3 public int getnumberofk int array,int k return number 利用遞迴找出第一次出現k的位置 publi...
面試題38 數字在排序陣列中出現的次數
問題說明 1.給定排序的陣列,例如從小到大已經排序。2.給定某個查詢關鍵字,求出該關鍵字出現的次數。3.完全遍歷一遍,時間複雜度為o n 並未充分利用排序的資訊。4.需要借鑑二分查詢的思想改進,演算法的時間複雜度為o logn package com.zhang.csdn author pizi d...
面試題38 數字在排序陣列中出現的次數
統計乙個數字在排序陣列中出現的次數。陣列是排序的,所以重複出現的數字是相鄰排列的。用二分查詢演算法,找到第一次出現的位置,和 最後一次出現的位置。判斷第一次出現的位置條件為 當前數字的前乙個是否與之相等,若是則繼續查詢,否則該位置就是第一次出現的位置。判斷最後一次出現的位置條件為 當前數字的後乙個是...