在有序旋轉陣列中查詢最小值

2021-08-30 21:32:16 字數 2780 閱讀 9824

有序陣列a經過一次旋轉處理,也可能沒有旋轉,且a中肯能存在重複的數字。例如有序陣列[1,2,3,4,5,6]可以旋轉處理成[4,5,6,1,2,3];特例一,[1,2,3,4,4,4,4,4,4]旋轉成[4,4,4,4,4,1,2,3,4];特例二,[1,2,3,4,4,4,4,4,4]旋轉成[4,1,2,3,4,4,4,4,4];特例三,[1,1,1,1,1,2,3]旋轉成[1,2,3,1,1,1,1]。
package com.lancq.array;

/** * @author lancq

* @description

* @date 2018/11/4

**/public class arraytest ;

int a2 = new int;

int a3 = new int;

int a4 = new int;

int a5 = new int;

int a6 = new int;

int a7 = new int;

system.out.println("遞迴查詢旋轉陣列中的最小值:");

system.out.println(findmininrotatedarray(a,0, a.length-1));

system.out.println(findmininrotatedarray(a2,0, a2.length-1));

system.out.println(findmininrotatedarray(a3,0, a3.length-1));

system.out.println(findmininrotatedarray(a4,0, a4.length-1));

system.out.println(findmininrotatedarray(a5,0, a5.length-1));

system.out.println(findmininrotatedarray(a6,0, a6.length-1));

system.out.println(findmininrotatedarray(a7,0, a7.length-1));

system.out.println("非遞迴查詢旋轉陣列中的最小值:");

system.out.println(findmininrotatedarray2(a));

system.out.println(findmininrotatedarray2(a2));

system.out.println(findmininrotatedarray2(a3));

system.out.println(findmininrotatedarray2(a4));

system.out.println(findmininrotatedarray2(a5));

system.out.println(findmininrotatedarray2(a6));

system.out.println(findmininrotatedarray2(a7));

}/**

* 遞迴:查詢旋轉陣列中的最小值

* 有序陣列a經過一次旋轉處理,也可能沒有旋轉,且a中肯能存在重複的數字。

* 例如有序陣列[1,2,3,4,5,6]可以旋轉處理成[4,5,6,1,2,3];

* 特例一,[1,2,3,4,4,4,4,4,4]旋轉成[4,4,4,4,4,1,2,3,4];

* 特例二,[1,2,3,4,4,4,4,4,4]旋轉成[4,1,2,3,4,4,4,4,4];

* 特例三,[1,1,1,1,1,2,3]旋轉成[1,2,3,1,1,1,1]

* @param a

* @param left

* @param right

* @return

*/public static int findmininrotatedarray(int a, int left, int right)

int mid = left + (right - left)/2;

if(a[left] > a[mid]) else if(a[left] < a[mid]) else

}/**

* 非遞迴:查詢旋轉陣列中的最小值

* 有序陣列a經過一次旋轉處理,也可能沒有旋轉,且a中肯能存在重複的數字。

* 例如有序陣列[1,2,3,4,5,6]可以旋轉處理成[4,5,6,1,2,3];

* 特例一,[1,2,3,4,4,4,4,4,4]旋轉成[4,4,4,4,4,1,2,3,4];

* 特例二,[1,2,3,4,4,4,4,4,4]旋轉成[4,1,2,3,4,4,4,4,4];

* 特例三,[1,1,1,1,1,2,3]旋轉成[1,2,3,1,1,1,1]

* @param a

* @return

*/public static int findmininrotatedarray2(int a)

//說明陣列在 a[low] 至 a[high] 上沒有旋轉

if(a[low] < a[high])

mid = (low + high) / 2;

//說明最小值在a[low] 至 a[mid]之間

if(a[low] > a[mid])

//說明最小值在a[mid] 至 a[high]之間

if(a[mid] > a[high])

//特殊情況 a[low]==a[mid]==a[high]

while(low < mid) else if(a[low] < a[mid]) else }}

return math.min(a[low],a[high]);

}}

在有序旋轉陣列中找到最小值

題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。基本思路 盡可能的利用二分查詢,但是最壞情況仍然無法避免o n 的時間...

在有序旋轉陣列中找到最小值

在有序旋轉陣列中找到最小值 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。要求 期望複雜度為o log n o log n...

有序旋轉陣列最小值

題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。根據題目分析 有序指公升序 旋轉處理將公升序陣列分成前後兩部分,進行整...