題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的旋轉,輸出旋轉陣列的最小元素,例如陣列為的乙個旋轉,該陣列的最小元素為1。
其實這裡想了乙個題外話,如果乙個遞增的陣列,一直按照乙個方向無論旋轉多少次,都還是兩個遞增陣列的拼接,如題目中的旋轉就是和的拼接。證明的話,可以用歸納法。
就這道題來說,解法是二分查詢;
int findmin(int* a, int size) else
mid = (low + high) / 2;
}return a[high];
}
int findmin(int* a, int size) else
mid = (low + high) / 2;
}if (high == size - 1 && a[high] > a[low])
return a[0];
return a[high];
}
然後書上又說了一種情況,index為low,high,mid的三個元素大小都相等。這樣就是說,我們無法判斷最小元素在mid的左邊還是右邊;其實我們可以分兩種情況,然後回溯,但是如果資料規模太大,可能會導致棧的深度很深,所以書上採用的一種思路是遇到這種情況直接遍歷就好,也不是沒有道理。
那麼現在:
int findmin(int* a, int size)
int high = size - 1;
int low = 0;
int mid = (high + low) / 2;
while(low < high - 1)
return a[minindex];
}if (a[mid] > a[low]) else
mid = (low + high) / 2;
}if (high == size - 1 && a[high] > a[low])
return a[0];
return a[high];
}
劍指offer 面試題8 輸出旋轉陣列最小值
include using namespace std int min int arr,int len return arr q int main int m min arr,6 cout 這種 只能處理常規情況,如果陣列旋轉值為0,即陣列還是乙個遞增陣列,p q mid,陷入死迴圈。如果中間值跟兩...
劍指offer 面試題8 旋轉陣列的最小值
package chapter2 面試題8 旋轉陣列的最小值 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。public class 08 rotatearray int arr...
劍指offer 面試題8 旋轉陣列的最小數值
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0 我的 class solution return temp 分析 ...