旋轉陣列的最小數字

2022-08-30 12:45:08 字數 1383 閱讀 8217

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

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

例如陣列為的乙個旋轉,該陣列的最小值為1。

採用二分法來查詢

- 使用兩個指標分別指向陣列的第乙個元素和最後乙個元素(lo,hi)

- 中間元素(mid)>=前面的元素(lo) 說明前面遞增 mid=lo

- 中間元素(mid)<=後面的元素(lo) 說明後面遞增 mid=hi

- 兩隻指標距離是1,

表明第乙個指標指向第乙個遞增子陣列的末尾,

第二個指標指向第二個遞增子陣列的開頭,

第二個子陣列的第乙個數就是最小的陣列

因此hi就是我們查詢的結果

但是這裡面有一些陷阱:

1.如果陣列的全部元素都旋轉,即 旋轉後的陣列就是原陣列,則最小數字是第乙個數字

2.中間數字與首尾數字大小相等,如和,無法採用二分法,只能順序查詢。

public int min(int arr) 

int lo = 0;

int hi = arr.length - 1;

int mid = lo;

//如果陣列的全部元素都旋轉,即 旋轉後的陣列就是原陣列

//此時第乙個數字就是最小的數字,可以直接返回,這也是mid初始值是lo的原因

while (arr[lo] >= arr[hi])

mid = (lo + hi) / 2;

//解決陷阱2

if (arr[lo] == arr[hi] && arr[hi] == arr[mid])

if (arr[mid] >= arr[lo]) else if (arr[mid] <= arr[hi])

} return arr[mid];

}private int mininorder(int arr, int lo, int hi)

} return result;

}

測試用例

public void test01() ;

int i = min02(ints);

system.out.println("test01:" + i);

}public void test02() ;

int i = min02(ints);

system.out.println("test02:" + i);

}

輸出

test01:1

test02:0

旋轉陣列最小數字

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

旋轉陣列最小數字

旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...

旋轉陣列的最小數字

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