統計乙個數字在排序陣列中出現的次數。
思路:求乙個數字在這個排序陣列中出現的次數,首先想到的是使用二分查詢,當我找到乙個位置,然後往前就可以到達最前面第乙個出現該數字的位置,往後就可以到達最後面最後乙個出現該數字的位置,然後兩個位置相減此時就得到該數字出現的次數。但是問題在於我用二分查詢到位置後,然後迴圈得到最開始和最後的位置中如果整個陣列序列基本都是這個數字,那麼這個演算法的時間複雜度就單單迴圈就o(n),這樣必然很慢,還不如直接乙個乙個比較。所以這裡需要在二叉查詢中稍微改變下。找到第一位置後,然後向前向後移動後還是使用二叉查詢,這樣比較綜合時間複雜度低。
第一種使用內部使用迴圈:
public class solution
int firstindex = findfirst(array, k , 0, length - 1);
int lastindex = findlast(array, k , 0, length -1);
if(firstindex != -1 && lastindex != -1)else
}public static int findlast(int array, int k, int start, int end)else if(array[mid] > k)else
return i - 1;
}mid = (start + end) >> 2;
}return -1;
}}
第二種內部使用二分查詢(但是查詢first使用的是遞迴):
public class solution
int firstindex = findfirst(array, k , 0, length - 1);
int lastindex = findlast(array, k , 0, length -1);
if(firstindex != -1 && lastindex != -1)else
}private int findfirst(int array , int k, int start, int end)
int mid = (start + end) >> 1;
if(array[mid] > k)else if (array[mid] < k)else if(mid-1 >=0 && array[mid-1] == k)else
}//迴圈寫法
private int findlast(int array , int k, int start, int end)else if(array[mid] < k)else if(mid+1 < length && array[mid+1] == k)else
mid = (start + end) >> 1;
}return -1;
}}
數字在排序陣列中出現的次數
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 統計乙個數字在排序陣列中出現的次數。輸入 每個測試案例包括兩行 第一行有1個整數n,表示陣列的大小。1 n 10 6。第二行有n個整數,表示陣列元素,每個元素均為int。第三行有1個整數m,表示接下來有m次查詢。1 m 10 ...
數字在排序陣列中出現的次數
題目 統計乙個數字下排序陣列中出現的次數。例如輸入排序陣列和數字3,由於3在這個陣列中出現了4次,因此輸出4。當然第一眼就能想到遍歷這個陣列然後統計這個陣列中某個數字出現的次數。當然第一眼就能想到的方法通常來說效率都不怎麼樣 再稍微想一下這個題目,是乙個已序的陣列,所以呢,不難想到二分查詢。我們可以...
數字在排序陣列中出現的次數
題目 統計乙個數字在排序陣列中出現的次數。思路 總體思想是二分查詢和遞迴。把統計數字k的出現次數轉換為查詢第乙個k和最後乙個k。時間複雜度為o logn public int getnumberofk int array int k int length array.length int first...