一天一道LeetCode

本系列文章已全部上传至我的github,地址:

https://github.com/Zeecoders/LeetCode

欢迎转载,转载请注明出处

(一)题目

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).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

(二)解题

一个排好序的数组,经过一定的旋转之后得到新的数组,在这个新的数组中查找一个目标数。

那么,首先我们需要在旋转后的数组中找到原数组的起始点,并将数组分成两部分。

例如:4,5,6,7,0,1,2分为4,5,6,7和0,1,2

然后,确定目标数在哪一个部分,

最后,采用二分法来进行加速搜索!

具体看代码:

未优化版本

class Solution {
public:

    int search(vector<int>& nums, int target) {

        int len = nums.size();

        int i = 0 ; 

        int j = len-1;

        int p = 0 ;

        while(p+1<len&&nums[p]<nums[p+1]) p++;//找出第一个破坏升序的数即为旋转中心

        if(nums[0]<=target) j=p;//确定被查找的数在哪个部分

        else if(nums[len-1]>=target) i=p+1;

        while(i<=j)//二分搜索

        {

            int mid = (i+j)/2;

            if(nums[mid] == target) return mid;

            else if(nums[mid] >target) j= mid-1;

            else i = mid+1;

        }

        return -1;//未找到则返回-1

    }

};

AC之后一看运行时间8ms,看来代码还有待优化,于是在查找旋转中心的方法上进行优化,采用二分法进行搜索旋转中心。

优化版本


class Solution {

public:

    int search(vector<int>& nums, int target) {

        int len = nums.size();

        int i = 0;

        int j = len - 1;

        int p = 0;

        bool isfind = false;

        if (nums[0]>nums[len-1])//如果进行了旋转

        {

            while (i < j)//二分搜索旋转中心

            {

                if (i == j - 1) {

                    isfind = true;

                    break;

                }

                int mid = (i + j) / 2;

                if (nums[i] < nums[mid]) i = mid;

                if (nums[j] > nums[mid]) j = mid;

            }

        }

        if (isfind)//找到了旋转中心

        {

            if (nums[0] <= target) { j = i; i = 0; }

            if (nums[len - 1] >= target) { i = j; j = len - 1;}

        }

        while (i<=j)二分搜索目标数

        {

            int mid = (i + j) / 2;

            if (nums[mid] == target) return mid;

            else if (nums[mid] >target) j = mid-1;

            else i = mid+1;

        }

        return -1;

    }

};

优化后的版本运行时间4ms,快了一半!

【一天一道LeetCode】#33. Search in Rotated Sorted Array的更多相关文章

  1. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  2. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  3. [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  4. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  5. leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  6. LeetCode 33.Search in Rotated Sorted Array(M)

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...

  7. leetcode 33. Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. Java [leetcode 33]Search in Rotated Sorted Array

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...

  9. [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  10. LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)

    题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description   Problem :当前的数组 ...

随机推荐

  1. Docker配置 DNS

    Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件. 在容器中使用 mount 命令可以看到挂载信 ...

  2. Android开发艺术探索第五章——理解RemoteViews

    Android开发艺术探索第五章--理解RemoteViews 这门课的重心在于RemoteViews,RemoteViews可以理解为一种远程的View,其实他和远程的Service是一样的,Rem ...

  3. Linux 性能监测:CPU

    CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中 ...

  4. Android ocr识别文字介绍(文字识别)

    最近在做身份证号码识别,在网上搜索的一番后发现目前开源的OCR中tesseract-ocr算是比较强大的了,它由HP于1985年到1995年间开发,后来由google直接负责,经过谷歌进一步开发后,目 ...

  5. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  6. 可能是CAP理论的最好解释

    一篇非常精彩的解释CAP理论的文章,翻译水平有限,不准确之处请参考原文,还请见谅. Chapter 1: "Remembrance Inc" Your new venture : ...

  7. Xcode7.3.1中SKAudioNode在Scene转换后无声的问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在新的Xcode中之前可以正常运行的SKAudioNode代码 ...

  8. [线程]Thead 中传参数RuntimeError: thread.__init__() not called

    在写一个多线程类的时候调用报错 RuntimeError: thread.__init__() not called class NotifyTread(threading.Thread): def ...

  9. Mysql创建、删除用户、用户管理等相关:转载http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  10. android 集成微博常见问题

    我们在做微博集成登录.分享.聊天的时候,肯定会遇到很多的坑,这里总结下常见的问题. 文件不存在 C8998 的解决方法 如图我们走微博授权登录的时候如果OAuth2.0 授权设置回调页面设置和本地的不 ...