輸入:[1,2,3,3,4,5,6,7,8] 3
輸出:2
輸入:[1,3,5,7,9] 4
輸出:1
實現方式:二分+遞迴
主要思想:設定兩個游標,start,end,取start和end的中位數,及其左邊一位,和右邊一位,將三者與目標值的絕對差值進行比較。設中位數與目標的絕對差值為sm,左邊一位的絕對差值為sl,右邊一位的絕對差值為sr,對比較的結果我們花開兩枝
1. sm < sl && sm< sr:中位數與目標之間的差距比最近的左右兩邊都小,可以直接確定這就是最接近的值了
若不滿足條件1,則對此中位數的左右兩邊的子集分別求最接近的下標,並再次比較,取二者最接近的那乙個
no bb,show code
public static int findnearest(int array, int start, int end, int num)
int mid=array[midindex];
int left=array[(midindex-1)end? end:(midindex+1)];
int sm=math.abs(num-mid);
int sl=math.abs(num-left);
int sr=math.abs(num-right);
if(sm < sl && sm < sr)else
return ri;
}}
下面有乙個非遞迴版的,額,錯誤示例
比如說輸入為:[1,1,1,1,4,5,6,7,8] 4
他的輸出為:2
正確答案是:4
找出有序陣列中絕對值最小的數
假設陣列是從小到大排序,數值可能為負數 0 正數。思路一 可以一次性遍歷一遍,找出絕對值最小值,此時時間複雜度為o n 缺點是沒有利用陣列是有序的這一特點。思路二 陣列有序,可以利用二分查詢的特性。中間的數是正數,往後找 中間的數是負數,往前找。問題的本質是找到正數的最小值,或負數的最大值,分析以下...
找出有序陣列中和等於指定數的兩個數
題目 已知按序排列的整數陣列,輸入任意數number,當陣列中某兩數之和等於number時,列印出兩個數。要求 複雜度為o n 解法 陣列已是有序排列,且兩個加數一定滿足條件 較小加數 number 2 較大加數 那麼只需要找出該陣列的較小加數和較大加數分界index,以該分界為起點分別往左右兩邊逐...
有序陣列中找出給定數字的出現次數
問題 在排序陣列中,找出給定數字的出現次數,比如 1,2,2,2,3 中2的出現次數是3次。解答 使用二分查詢的方法分別找出給定數字的開始位置minindex和結束位置maxindex,最壞情況下時間複雜度為o logn 簡單 如下 二分搜尋 2.找 最大 下標i使得x i v 返回 i 或者 1 ...