栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

剑指Offer

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指Offer

原题链接

注意:直接遍历数组复杂度为O(N)不符合题目要求

文章目录
    • 基础分析
    • 特殊样例分析
    • 1.输入数组为空或数组大小为1
    • 2.旋转了0个元素,即数组还是有序的。
    • 3.因为重复元素导致无法区分中值是在那个数组的情况
    • 代码实现

基础分析

观察样例数组旋转后,数组可以看作两个排序后的子数组,而前面数组的元素都大于第二个数组。其中最小值正好位于两个数组的分界线,可以联想到二分法查找

一个指针指向数组的开始,一个指针指向数组的结束。第三个数组指向中间元素(begin+end)/2

根据二分思想如果arr[mid]对应的数字小于等于arr[end],说明其在第二个数组中,让end=mid。如果arr[mid]大于等于arr[begin]说明其在第一个数组中,begin=mid。

特殊样例分析 1.输入数组为空或数组大小为1

在开始函数中需要判断数组大小,当大小为1时返回此元素即可

2.旋转了0个元素,即数组还是有序的。

此时最小元素为第一个元素。所以我们让mid的初值为begin(0)
当arr[begin]>=arr[end]时说明旋转元素>0在执行二分

3.因为重复元素导致无法区分中值是在那个数组的情况

代码实现
#include
class Solution {
public:
    int FindMin(vector&arr)//顺序查找
    {
        int min=arr[0];
        for(int i=0;i rotateArray) {
        assert(!rotateArray.empty());
        if(rotateArray.size()==1)
        {
            return rotateArray[0];
        }
        int begin=0;
        int end=rotateArray.size()-1;
        int mid=begin;//让mid刚开始=begin
        while(rotateArray[begin]>=rotateArray[end])//当不满足while情况时
        //说明数组没有旋转直接返回mid下标对应的数组的值
        {
            if(end-begin==1)
            {
                mid=end;
                break;
            }
            mid=(end+begin)/2;
            //当mid对应值个前后相同时,只能通过顺序查找
            if(rotateArray[begin]==rotateArray[mid]&&rotateArray[mid]==rotateArray[end])
            {
                return FindMin(rotateArray);
            }
            if(rotateArray[mid]>=rotateArray[begin])
            {
                begin=mid;
            }
            if(rotateArray[mid]<=rotateArray[end])
            {
                end=mid;
            }
        }
        return rotateArray[mid];
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/273083.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号