Leetcode刷题之路(151-160)

153.寻找旋转排序数组中的最小值

寻找旋转排序数组中的最小值题目链接

  • 方法一:找到第一个后面小于前面的数就跳出,时间复杂度为O(n)
  public int findMin(int[] nums) {
          int result = nums[0];
          for(int i=1;i<nums.length;i++){
               if(nums[i-1]>nums[i]){
                     result=nums[i];
                     break;
				}
          }
        return result;
    }
  • 方法二:对于有序数组,想查找某个值比for遍历一次时间复杂度还低的方法有二分查找,因为原本是有序的,只是因为旋转了但还是局部有序的,我们可以考虑二分法来操作
 public int findMin(int[] nums) {
         int result = nums[0];
        int left = 0,right=nums.length-1;
        while(left<right){
            int mid = (left+right)/2;
            if(nums[mid]>nums[mid+1]){
                result=nums[mid+1];
                break;
            }
            if(nums[mid]>nums[right]){//如果最右边小于中间数,说明中间前面全都是有序的,所以缩小范围
                left=mid;
            }else{//如果最右边大于中间数,说明中间后面全都是有序的,所以缩小范围
                right=mid;
            }
        }
        return result;
    }

你可能感兴趣的:(leetcode刷题之路)