Search in Rotated Sorted Array

感觉这个题目在哪里看到过,面试有可能会被问起,所以还是记录一下。

题目地址:Search in Rotated Sorted Array

题目大意:有一组有序数据,从中间任意一个点进行一次旋转,如:0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2

 现在要在这组数里面寻找一个值,如果存在,返回他的下标值,如果不存在,返回-1;


解题思路:

O(N)方法:最简单的方法,遍历数据里面的每个数,判断与给定数是否相等。这种方法没有利用题目给的数据的有序特性。

O(logN)方法:采用二分查找。

二分查找,刚开始的时候,编写的二分查找,基本把所有的情况都给列出来了,首先根据nums[left]和nums[right]的大小,区分数组是全部有序的,还是具有拐点的,如果全部有序,则进行普通的二分查找。如果具有拐点,则把所有的情况都列出来,在进行相应的二分,更新left和right的值。

代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int length=nums.size();
        int left=0;
        int right=length-1;
        if(nums[left]>target && nums[right]<target)
            return -1;
        int mid;
        while(left<=right && left>=0 && right<length)
        {
            mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            if(nums[left]==target)
                return left;
            if(nums[right]==target)
                return right;
            if(nums[left]>nums[right])  //有逆转
            {
                if(nums[mid]>nums[left])
                    {
                        if(target>=nums[left] && target<nums[mid])
                            right=mid-1;
                        else left=mid+1;
                    }
            else    {
                    if(target>nums[mid] && target<=nums[left])
                        left=mid+1;
                    else right=mid-1;
                }
            }
            else{
                if(nums[mid]>target)
                    right=mid-1;
                else left=mid+1;
            }
        }
        
        
        return -1;
     
    }
};

方法缺点:感觉思路太不清晰了,在列出全部的情况的过程中,很容易把一些情况漏掉,而且代码可读性太差,换个人可能都不知道要干什么。如果再让我写一次,很大可能写不对。


改进:改进想法,先把那个转折点找出来,再根据target的大小来进行二分查找。这样,二分查找就是普通的二分查找了。

代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
     int left=0;
     int right=nums.size()-1;
     int minPoint;
     if(nums[left]<=nums[right])
        return binarySearch(nums,target,left,right);
     if(nums[left]>nums[right])
         minPoint=searchRotatedPoint(nums);
     if(target>=nums[left])
        return binarySearch(nums,target,left,minPoint-1);
     if(target<nums[left])
        return binarySearch(nums,target,minPoint,right);
         
     
     
    }
    int searchRotatedPoint(vector<int> nums)
    {   int left=0;
        int right=nums.size()-1;
        int mid;
        while(left<right)
        {
            mid=(left+right)/2;
            if(nums[mid]>nums[left])
                left=mid;
            if(nums[mid]<nums[left])
                right=mid;
            if(right-left==1)
                return nums[left]>nums[right]?right:left;
            
        }
        return left;
    }
    
    
    int binarySearch(vector<int> &nums, int target, int start, int end)
    {
        int left=start;
        int right=end;
        int mid;
        while(left<right)
        {
            mid=(left+right)/2;
            if(nums[mid]==target)
                return mid;
            if(nums[mid]>target)
                right=mid-1;
            if(nums[mid]<target)
                left=mid+1;
                
        }
        if(left==right && nums[left]==target)
            return left;
        return -1;
    }
};
这个方法的话思路比较清晰,代码可读性也较好。比较容易复现


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值