C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
生活随笔
收集整理的這篇文章主要介紹了
C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數字在已排序數組中出現的次數
提交網址:?http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190
參與人數:2597 ? ?時間限制:1秒 ? 空間限制:32768K本題知識點:?數組
題目描述
統計一個數字在已排序數組中出現的次數。
樣例輸入:2?3?3?3?3?4?513
6,5,3,3,1,0
3
樣例輸出:42
提交網址:?http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190
參與人數:2597 ? ?時間限制:1秒 ? 空間限制:32768K本題知識點:?數組
題目描述
統計一個數字在已排序數組中出現的次數。
樣例輸入:2?3?3?3?3?4?513
6,5,3,3,1,0
3
樣例輸出:42
分析:
? ? ? 數字在排序數組中出現的次數,首先想到的方法應該是用hash表,計算出數組中所有數據出現的次數,然后直接查找,時間復雜度O(n),空間復雜度O(n)。但這種方法未能利用該數組是已排序的特點,所以如果輸入是已排好序的題目,要及時聯想到二分查找。
具體步驟:先用二分法找到某個目標值k出現的位置,然后統計前面一半中k出現的次數sum1,后面一半中k出現的次數sum2,最后sum=sum1+1+sum2。二分查找時間復雜度是O(logn)。
AC代碼:
#include<cstdio> #include<vector> using namespace std; class Solution { public:int GetNumberOfK(vector<int> data, int k) {int idx = biSearch(data,0, (int)data.size(), k); // 某個k的位置為idx if(idx == -1) return 0; // 未找到 int sum = 1; // 如果能找到1個k,sum初始化為1 for(int j = idx - 1; j >= 0; j--){ // 統計之前的那個k所在位置idx的前面k出現的次數 if(data[j] == k) sum++;else break;}for(int j = idx + 1; j < (int)data.size(); j++){ // 統計之前的那個k所在位置idx的后面k出現的次數if(data[j] == k) sum++;else break;}return sum;} int biSearch(vector<int> &data, int begin, int end, int k){if(begin >= end) return -1;int mid = (begin + end)/2;if(data[mid] == k) return mid; // 如果在區間mid處找到,提前返回;否則遞歸地在前一半去找,否則在后一半去找,總能找到 int pos1, pos2 = -1;pos1 = biSearch(data,begin,mid,k); if(pos1 != -1) return pos1;pos2 = biSearch(data,mid + 1, end,k); if(pos2 != -1) return pos2; return -1;} }; // 以下為測試 int main() {Solution sol;vector<int> vec1={1,3,4,5};vector<int> vec2={6,5,3,3,1,0}; int res1 = sol.GetNumberOfK(vec1, 4);int res2 = sol.GetNumberOfK(vec2, 3); printf("%d\n", res1); printf("%d\n", res2); return 0; }轉載于:https://www.cnblogs.com/enjoy233/p/10408796.html
總結
以上是生活随笔為你收集整理的C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux查看网卡UUID另一方法
- 下一篇: s3c2440移植MQTT