旋转数组中寻找最小值

来源:互联网 发布:300451 创业软件股吧 编辑:程序博客网 时间:2024/04/24 23:52

Find Minimum in Rotated Sorted Array


  • 题目来源:
    leetcode 153

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

int findMin(vector<int>& nums) {    if (nums.size()==1||nums[0]<nums[nums.size()-1]) {  //当nums[0]<nums[nums.size()-1]时,说明数组一开始就是递增的,所以返回第一个元素        return nums[0];    }    int start = 0;    int end = nums.size()-1;    int mid;    while ((end-start)>1) {  //当end-start=1时终止,end所指的数就是最终答案        mid = (start+end)/2;        if (nums[start]>nums[mid]) {  //当nums[start]>nums[mid]说明在左半部分;也可能是mid所指,所以end=mid,而不是end=mid-1            end = mid;        }        else{                         //当nums[start]<nums[mid]说明在右半部分;也可能是mid所指,所以start=mid,而不是start=mid-1            start=mid;        }    }    return nums[end];  //最终返回end所指的数字}

二分查找总结

  • 问题:到底start=mid,还是start=mid+1
    end = mid,还是end=mid-1
    到底循环条件是(start<=end)还是(start< end)还是(end-start)>1

  • 结论:

  • 当所要找的位置在左边,或者右边但是不可能是mid所指的点的时候,使用start=mid+1(在右边区域,且不可能包含mid所指);end=mid-1(在左边区域,且不可能为mid所指);具体可以比较以下两个链接中的二分查找。
  • 当start=mid+1,且end=mid-1来循环时;循环条件是(start<=end)
    如:http://blog.csdn.net/hellotomhaha/article/details/54974443
  • 当一边包含mid,一边不包含mid时,循环条件(start< end)
    如:http://blog.csdn.net/hellotomhaha/article/details/54985475
  • 当两边都不包含mid时,循环条件是(end-start)>1,如本题。
    https://leetcode.com/submissions/detail/92511460/
0 0
原创粉丝点击