判斷乙個有序陣列中乙個數字重複出現的次數

2021-08-25 08:57:21 字數 728 閱讀 1431

首先可以想到二分法,但是二分法只是找到其中乙個的位置,這個時候不能確定個數

為了能夠確定個數,可以有乙個簡單的方法,乙個乙個往前數,乙個乙個往後面數,直到數到邊界為止,**如下

class solution 

int binarysearch(std::vector

v,int left,int right,int k)

};

改進:可以看到這裡使用了一次二分法,但是後面尋找邊界的時候沒有利用到前面和後面仍然是有序這個條件,仍然可以用二分法尋找,對於左邊,只要它前面還有乙個和它一樣的數,那麼久二分法查詢[0,indexleft-1],直到不滿足條件,返回indexleft,對於右邊,如果右邊還有乙個相同的數,那麼indexright+1,繼續二分查詢,直到不滿足,最後indexleft和indexright就是邊界。**如下

class solution 

while(indexright1 && data[indexright+1]==k)

return (indexright-indexleft+1);

}int binarysearch(std::vector

v,int left,int right,int k)

return -1;

}};

總結:上面第二種演算法明顯優於第一種,尤其是在資料量大的情況下。

判斷乙個陣列是否有序

一般來說,判斷乙個陣列或序列是正序,倒序還是亂序,需要我們將這個陣列完整的遍歷一遍後才能得出答案,它不像折半查詢那樣只處理少量的資料便能得出結論,因為一段包含成千上萬個元素的有序序列,哪怕將其中兩個元素的位置調換都能將這個序列變成亂序序列.如下面這段序列,只是數字8和9調換,就變成了亂序的.0,1,...

合併兩個有序數組成乙個有序陣列

題目 有兩個陣列a和b,將它們合併成陣列c,需要c也是有序陣列。有兩種實現思路 定義乙個新陣列,長度為兩個陣列長度之和,將兩個陣列都copy到新陣列,然後排序。給兩個陣列分別定義乙個下標,最大長度是陣列長度減一,按位迴圈比較兩個陣列,較小元素的放入新陣列,下標加一 注意,較大元素對應的下標不加一 直...

將兩個陣列並為乙個有序陣列

將兩個陣列並為乙個有序陣列 include define n 6 陣列列印函式 void print int x printf n 氣泡排序函式 void bubble sort int x 判斷資料的大小順序 int judgment order int x if 1 flag 如果原始資料不是從...