查詢區間內距離標尺最近且不大於最大值的元素

2021-09-08 13:40:05 字數 3063 閱讀 8652

乙個混雜陣列中,要求找到指定標尺相差最小的元素並且該元素不得超出規定的最大值,如何查詢呢?

比如 在陣列  array(1,2,34,5,6,7,10,31,40,32,36,58,83,4,3) 中,要求找到距離20最近但是又不得大於30的元素

那麼這道題很明顯,最容易想到的方案是排序,排序後進行查詢比對20左右的元素即可。(或者可以把20也放入陣列中,查詢20 找到它的前後兩位進行比較即可)

但是事實上這個陣列是變化的,標尺和最大值也是變化的,甚至都不知道標尺和最大值誰更大,陣列中是否有重複值,所以這個**還是要寫的更加複雜和全面一些才行。

**如下:

<?php 

function find_nearest_number($array,$stand,$max

)

//陣列裡面沒有標尺

// 沒有標尺要上 製造標尺也要上

$array=$stand

;

sort($array);//

進行排序

$find_stand_index=array_search($stand,$array);//

找到標尺所在位置

//現在再次找到標尺所在位置 找標尺左右兩元素進行比對

$prev=isset($array[$find_stand_index-1])?$array[$find_stand_index-1]:null;//

前乙個$next=isset($array[$find_stand_index+1])?$array[$find_stand_index+1]:null;//

後乙個if($find_max_index!==false

)

if($next===null

)

//前後值都存在 取前後距離標尺最近的

return

$stand-$prev>$next-$stand?$next:$prev;//

兩段距離做比較

}

//此時說明最大值不在陣列中 要獲取前後值和最大值做比較

if($prev===null

)

return

$next

; }

if($next===null

)

if($next>$max

)

return

$stand-$prev>$next-$stand?$next:$prev;//

兩段距離做比較

}elseif($max==$stand

)

//說明陣列中沒有標尺 找標尺左邊的乙個元素即可

$array=$stand

;

sort($array);//

進行排序

$find_stand_index=array_search($stand,$array);//

找到標尺所在位置

//現在再次找到標尺所在位置 找標尺左邊元素進行比對

$prev=isset($array[$find_stand_index-1])?$array[$find_stand_index-1]:null;//

前乙個if($prev===null

)

return

$prev;//

此時直接返回前乙個左邊元素即可

}else

//陣列中沒有最大值 則把最大值加入陣列並排序

$array=$max

;

sort($array

);

$find_max_index=array_search($max,$array);//

找到最大值所在位置

//現在再次找到最大值所在位置 找最大值左邊元素進行比對

$prev=isset($array[$find_max_index-1])?$array[$find_max_index-1]:null;//

前乙個if($prev===null

)

return

$prev

; }

}?>

呼叫如下:

結果如圖:

找到17是符合要求的,那麼如果出現標尺本身就在陣列中呢?

或者說最大值小於標尺呢?

那麼說明這段**還是能經得起考驗的。

接下來我們可以考慮用另外一種方法解決這個問題

我們設想,實際上就是用標尺去和每乙個元素做差值運算,其絕對值越小,則越符合條件,但是也不能大於最大值,那麼我們看看下面**:

<?php 

function find_nearest_number_by_each($array,$stand,$max)//

如果大於最大值 顯然不符合條件

if($diff===null && $nearest===null

) else}}

return

$nearest;}

?>

呼叫如下:

如果最大值大於標尺

我們可以明顯看到 使用sort排序加上search查詢方法,明顯邏輯要複雜的多,而直接foreach迴圈一趟,反而容易理解和解決這個問題,這也是告訴我們一些道理。

有時候,最簡單的也是最有效的!

06多次查詢某區間內topk問題

題目描述 給定乙個陣列,需要多次查詢不同區間內的,第k大或者第k小的元素。考慮題目是多次查詢,如果採用只對查詢區間內的元素進行排序的思路,然後輸出第k大的數的策略,那麼下一次進行查詢時,還需要對另外乙個區間進行排序,再次查詢。而且,如果兩次查詢的區間有重疊區域的話,第一次排序時已經破壞了陣列,使得第...

查詢任意區間內不同元素的個數

include using namespace std define ll long long const int maxn 2e5 5 const int mod 1e9 7 const double eps 1e 9 const double pi acos 1.0 const int inf ...

06多次查詢某區間內topk問題

題目描述 給定乙個陣列,需要多次查詢不同區間內的,第k大或者第k小的元素。考慮題目是多次查詢,如果採用只對查詢區間內的元素進行排序的思路,然後輸出第k大的數的策略,那麼下一次進行查詢時,還需要對另外乙個區間進行排序,再次查詢。而且,如果兩次查詢的區間有重疊區域的話,第一次排序時已經破壞了陣列,使得第...