旋轉陣列最小數字

2021-10-08 19:45:38 字數 1553 閱讀 5311

/*旋轉陣列最小數字(劍指offer、二分查詢)

* 題目描述:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

* 輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

* 解題思路:

* 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。

* 結合資料的特點前半部分遞增,後半部分遞減,從頭開始遍歷直到有元素小於前乙個數.

* 上面一種思路的目的是要找到遞增部分和遞減部分的臨界點該點的特性為大於前乙個和後乙個元素

* 二分查詢:

* 宣告p1指向查詢區域的首元、p2指向查詢區域的末元,mid指向當前查詢元素。

* p1=1,p2=data.length,mid=(p1+p2)/2

* 如果mid指向的數的左邊的元素小於mid右邊的元素也小於mid,返回mid下乙個元素的值

* 如果mid左邊的元素小於mid右邊的元素大於mid,p2=mid mid=(p2-p1)/2

* 如果mid左邊的元素大於mid右邊的元素小於mid,p1=mid mid=(p2-p1)/2

* !!!這種解法失敗,原因:測試資料中包含不旋轉的資料,即完全有序的陣列,這種情況不再存在上面思路的特徵點!!!

*題解思路:

* 維持兩個指標p1指向搜尋區域的左邊,p2指向搜尋區域的右邊,mid指向搜尋區域的中間

* 如果mid大於p1說明從p1到mid是遞增的,最小值應該位於mid到p2,將p1指向mid。

* 如果mid小於p1說明p1到mid是遞減的,最小值就位於p1到mid中,將p2指向mid。

* 當mid等於p1,無法判斷p1到mid是增或減,遍歷p1到p2取最小值

*

* */

public class xuanzhuanshuzudezuixiaoshuzi ;

system.out.println(solution.minarray(numbers)); }}

class xuanzhuanshuzudezuixiaoshuzi_solution1

//如果mid小於左邊的且小於右邊的,返回mid

if(numbers[mid]<=numbers[mid-1]&&numbers[mid]<=numbers[mid+1])

//如果mid大於左邊的 小於右邊的,p2=mid、mid=(p1+p2)/2

if(numbers[mid]>=numbers[mid-1]&&numbers[mid]<=numbers[mid+1])

}return numbers[mid];

}}class xuanzhuanshuzudezuixiaoshuzi_solution2

if(numbers[(p1+p2)/2] < numbers[p2])

if(numbers[(p1+p2)/2] == numbers[p2]) else

}return temp;}}

} return numbers[(p1+p2)/2];

}}

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...

旋轉陣列的最小數字

1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...

旋轉陣列的最小數字

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...