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

Leetcode 33.搜索旋转排序数组(beat 100%,c++)

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

Leetcode 33.搜索旋转排序数组(beat 100%,c++)

本题的整体思路为二分搜索法。

整体思路如下:
(1)从nums的左右两边同时遍历,寻找出断点的位置,赋初值i=0、j=len-1。

       方法:若nums[i]>nums[i+1],表示i为转折的断点,i左边、右边各按照升序排序;

                  若nums[j]

        一旦找到断点,则退出循环。并用min记录右半部分第一个位置(即数组中最小数值的位置),用max记录左半部分最后一个位置(即数组中最大数值的位置)。

(2)先将显而易见无法在数组中找到位置的数值情况返回-1,即target小于最小值或大于最大值、target小于左半部分最小值或大于右半部分最大值。

(3)再继续缩小范围:若比右半部分的最大值要小,因此属于右半部分,将max指针赋值为最后一个位置;若比左半部分的最小值要大,因此属于左半部分,将min赋值为0。

此时min到max中的数值为全部升序的顺序,可以按照正常二分搜索。

(4)定义for循环,定义mid指针为min+(max-min)/2,因为int类型,不需要考虑小数的出现,无论max-min数值为奇数还是偶数,mid均为中间位置指针。循环条件为min<=max。

        当nums[mid]=target时直接返回mid;当nums[mid]target,使max=mid-1。

        若nums[min]>target或者nums[max]

(5)若循环结束后还未找到target,则直接返回-1,表示无法找到。

class Solution {
public:
    int search(vector& nums, int target) {
        int len=nums.size(); //定义vector的长度
        int max=len-1,min=0;
        for(int i=0,j=len-1;inums[i+1]) {
                max=i; min=i+1;
                break;
            }
            if(nums[j]nums[max]) return -1;
        if(target>nums[len-1]&&target=nums[0]){ 
            min=0;
        }
        for(int mid=min+(max-min)/2;min<=max;mid=min+(max-min)/2){
            if(nums[mid]==target) return mid;
            if(nums[min]>target||nums[max]target) {
                max=mid-1;
            }
        }
        return -1;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/864432.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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