一天一道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. for循环&len函数和range函数的运用

     函数:len() 作用:返回字符串.列表.字典.元组等长度 语法:len(str) 参数: str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度 实例 1.计算字 ...

  2. ACM Wooden Stricks

    有一堆n根木棍.每根棍子的长度和重量是预先知道的. 这些棒子将被木工机器逐一加工..它需要一些时间,称为安装时间,用于机器准备加工棒.设置时间与机器中的清洁操作和更换工具和形状相关联.木工机械的安装时 ...

  3. let 和 const 命令

    let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...

  4. Docker常见仓库MySQL

    MySQL 基本信息 MySQL 是开源的关系数据库实现. 该仓库提供了 MySQL 各个版本的镜像,包括 5.6 系列.5.7 系列等. 使用方法 默认会在 3306 端口启动数据库. $ sudo ...

  5. try_files 居然有这种用法

    try_files 参考:https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ Use the tr ...

  6. 独立开发一个云(PaaS)的核心要素, Go, Go, Go!!!

    最近一年的工作,有很大的比重在做云平台的事情,简单来说,就是为公司内用户提供一个PaaS,用户可以在我们的云平台上方便的将单机服务程序扩展为多实例程序,以平台服务化的方式对外提供.在这里简单分享一下. ...

  7. ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明

    ROS(indigo) 安装和使用更新版本的Gazebo,本文以7为例. Gazebo7支持更多新的功能,如果使用下面命令安装ROS(indigo): ~$ sudo apt-get install ...

  8. C语言如何在两个文件中访问同一个全局变量

    方法一: 不使用头文件. 1.c 中 int var; 2.c 中 extern int var; 方法二: 使用头文件. 1.c 中 int var; 不必添加#include "1.h& ...

  9. 在电脑上安装Linux操作系统

    1硬件需求 A 一台电脑 B 一个优盘 2软件需求 A制作优盘启动盘的软件PowerISO BLinux操作系统的镜像文件 3安装PowerISO,并使用PowerISO A安装PowerISO B插 ...

  10. springMVC源码分析--拦截器HandlerExecutionChain(三)

    上一篇博客springMVC源码分析--HandlerInterceptor拦截器调用过程(二)中我们介绍了HandlerInterceptor的执行调用地方,最终HandlerInterceptor ...