找出有序陣列中最接近給定目標數的下標 遞迴實現

2021-08-26 15:12:18 字數 818 閱讀 4296

輸入:[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 ...