leetcode刷题 153.寻找旋转排序数组中的最小值
生活随笔
收集整理的這篇文章主要介紹了
leetcode刷题 153.寻找旋转排序数组中的最小值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析:
解法一:
該題是用來尋找最小值,我們可以直接用數組求最小值的方法來進行求解,但是我們觀察到此題數組是一個 旋轉數組,只要除第一位外后面每一位比第一位小,那么它就是最小值,否則第一位就是最小值 class Solution { public:int findMin(vector<int>& nums) {for(int i=0;i<nums.size();i++){if(nums[i]<nums[0]){return nums[i];}}return nums[0];} };解法二:
二分查找:使用二分查找時,需要始終將目標值套住,并不斷收縮左右邊界。因此我們分析,當中間值小于右 邊界值時,我們可以收縮右邊界;當中間值大于右值時,我們可以收縮左邊界 public static int findMin(int[] nums) {int len = nums.length;int low = 0;int high = len-1;// 二分查找while(low < high){ // 取中間值int mid = (high+low)/2; // 如果中間值小于最大值,則最大值減小 // 疑問:為什么 high = mid;而不是 high = mid-1; // 解答:{4,5,1,2,3},如果high=mid-1,則丟失了最小值1if (nums[mid] < nums[high]) {high = mid;} else { // 如果中間值大于最大值,則最小值變大 // 疑問:為什么 low = mid+1;而不是 low = mid; // 解答:{4,5,6,1,2,3},nums[mid]=6,low=mid+1,剛好nums[low]=1 // 繼續疑問:上邊的解釋太牽強了,難道沒有可能low=mid+1,正好錯過了最小值 // 繼續解答:不會錯過!!! 如果nums[mid]是最小值的話,則其一定小于nums[high],走if,就不會走else了low = mid+1;}} // 疑問:為什么while的條件是low<high,而不是low<=high呢 // 解答:low<high,假如最后循環到{*,10,1,*}的這種情況時,nums[low]=10,nums[high]=1,nums[mid]=10,low=mid+1, // 直接可以跳出循環了,所以low<high,此時low指向的就是最小值的下標; // 如果low<=high的話,low=high,還會再不必要的循環一次,此時最后一次循環的時候會發生low==high==mid, // 則nums[mid]==nums[high],則會走一次else語句,則low=mid+1,此時low指向的是最小值的下一個下標, // 則需要return[low-1]return nums[low];}總結
以上是生活随笔為你收集整理的leetcode刷题 153.寻找旋转排序数组中的最小值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode刷题 74.搜索二维矩阵
- 下一篇: 脚本语言和编程语言有什么区别