在乙個排序的陣列中,如,經過旋轉後得到,當然也可以得到原陣列,在該旋轉後的陣列中查詢某個元素。
陷阱在於陣列不是嚴格遞增的
比如這樣有很多重複的元素的陣列時,當要查詢0時,在mid位置的元素為1,不能判斷怎麼縮小範圍
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define debug_
int find_rotate(vector
& vec,int left,int right,int value)
//首先考慮mid、left、right中有相同值的情況
//因為如果有相同值,無法判斷二分查詢的方向,且不好分類討論
if (vec[right] == vec[left])
if (vec[mid] == vec[left])
if (vec[mid] == vec[right])
//此時mid、left、right都不相同
if (vec[mid]>vec[left]&&vec[mid]>vec[right] )
else
}else}}
if (vec[left]==value)
return left;
else
if (vec[right] == value)
return right;
else
return -1;
}int main()
; vector
vec_2;
vector
vec_3;
cout
<< find_rotate(vec, 0, vec.size() - 1, 2)<< find_rotate(vec_2, 0, vec_2.size() - 1, 2)<< find_rotate(vec_3, 0, vec_3.size() - 1, 0)0;}
演算法題 旋轉陣列
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉...
旋轉陣列查詢指定值
遞增陣列 1,2,3,4,5 變化為 5,6,1,2,3,4 給定k,判斷是否存在,並返回其索引位置 二分查詢 選擇中間位置作為判斷的分界點 所以二分中,必定有一部分陣列是遞增有序的,而另一部分則不是,所以當我們取中間點的時候,首先判斷中間點是不是所要尋找的值。如果不是,則尋找遞增的那一部分陣列 1...
查詢旋轉陣列最小值
求對於長度為n的陣列a,求子陣列的和接近0的子陣列。例如 定義n長度的空間sum 0 n 1 sum i 是a的前i項和。並且有sum i 1 sum i a i 1 首先對sum i 進行排序,找到求和最接近的2個值。同時記錄使得值最小的陣列最短的那一組。如圖 通過求取求和值最接近的一組資料可以找...