C 演算法 查詢旋轉陣列中的最小值 允許重複元素

2021-08-15 19:04:12 字數 857 閱讀 9382

假定乙個有序陣列中的元素以某個支點做了旋轉,如陣列01234567變成了34567012,查詢該旋轉後陣列中的最小值。

演算法思路:

旋轉後陣列被分為了兩部分,較大的一部分和較小的一部分並且較小的一部分在後面,如果我們取中間(非兩頭)的乙個元素c,那麼它相對於第乙個a和最後乙個元素b有如下關係:

c < a , c < b => 最小元素在a-c之間

c > a , c > b => 最小元素在c-b之間

c = a , c = b => 縮小查詢範圍

用二分法實現**如下:

#include 

#include

using

namespace

std;

int minnumberinrotatearray(vector

rotatearray)

int start = 0;

int end = rotatearray.size() - 1;

while (start < end)

if (rotatearray[mid] < right || rotatearray[mid] < left)

if (rotatearray[mid] == left)

}if (rotatearray[mid] == right) }}

return rotatearray[start];

}int main()

; cout

<< minnumberinrotatearray(rotatearray) << endl;

return

0;}

注意:以上**請使用c++11編譯

查詢旋轉陣列最小值

求對於長度為n的陣列a,求子陣列的和接近0的子陣列。例如 定義n長度的空間sum 0 n 1 sum i 是a的前i項和。並且有sum i 1 sum i a i 1 首先對sum i 進行排序,找到求和最接近的2個值。同時記錄使得值最小的陣列最短的那一組。如圖 通過求取求和值最接近的一組資料可以找...

查詢旋轉陣列的最小值

旋轉後的陣列變成兩個有序陣列,最小值為兩個陣列的的分界線,前面子陣列的值都大於後面子陣列的值 用索引left right分別指向首尾元素 若陣列是普通公升序陣列,則left 若陣列是迴圈公升序陣列,則left right 計算mid,若mid 若mid right,則,後半段是迴圈公升序陣列 直到找...

旋轉陣列的最小值

題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...