※ Leetcode - Binary Search - 153. Find Minimum in Rotated Sorted Array(二分查找)

本文探讨了如何在已知无重复元素的旋转有序数组中高效查找最小元素的方法。介绍了二分查找的基本形式,并提出了几种解决方案,包括直接查找、排序后再取最小值等方法,重点介绍了一种改进的二分查找算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Problem Description

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

 

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

 

Find the minimum element.

 

You may assume no duplicate exists in the array.

 

麻蛋一开始没看懂题,就是给你一个旋转后的有序数组,让你求这个数组中最小的元素(旋转中心)。

PS:数组中没有重复元素。

 

 

2.二分查找的两种形式

一种是:

int BinSearch(int target, int nums[]){
    int low = 0, high = nums.length - 1;
    while(low <= high){
        int mid = (low + high) / 2;
        if(nums[mid] == target)
            return mid;
        if(nums[mid] < target)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

另一种:

int BinSearch(int target, int nums[]){
    int low = 0, high = nums.length;
    while(low < high){
        int mid = (low + high) / 2;
        if(nums[mid] == target)
            return mid;
        if(nums[mid] < target)
            low = mid + 1;
        else
            high = mid;
    }
    return -1;
}



3. My solution

本质是一个查找相邻逆序对的过程。

  int findMin(vector<int>& nums)
    {
        int len=nums.size();
        if(len==1)
            return nums[0];
        int left=0,right=len-1;
        int mid=(left+right)/2;
        while(left<right)
        {
            mid=(left+right)/2;
      //出现逆序说明找到答案
            if(nums[mid]>nums[mid+1])
                return nums[mid+1];
      //逆序在mid和right之间
            if(nums[mid]>nums[right])
                left=mid+1;
            else
                right=mid;
        }
        return nums[mid];
    }



4.其他解法(均已AC

//My solution1 Qsort O[nlogn]
    int findMin(vector<int>& nums)
    {
        sort(nums.begin(),nums.end());
        return nums[0];
    }
 
//My solution2 O[n]遍历找最小的数
    int findMin(vector<int>& nums)
    {
        int ans=1<<32-2;
        int len=nums.size();
        for(int i=0; i<len; i++)
        {
            if(nums[i]<ans)
                ans=nums[i];
        }
        return ans;
    }
//My solution3 找寻断点 O[n]
    int findMin(vector<int>& nums)
    {
        int len=nums.size();
        for(int i=0; i<len-1; i++)
        {
            if(nums[i]>nums[i+1])
                return nums[i+1];
        }
        return nums[0];//本身就是有序的,输出第一个元素
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值