一天一道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. REACT相关资料合集

    ===实例=== https://github.com/jesseskinner/react-webpack-demo ===UI组件库=== https://github.com/amazeui/a ...

  2. 安利三款提升幸福感的chrome插件

    谷歌访问助手 chrome浏览器一直是各大码农推荐的比较好用的浏览器,速度快.插件多. 但是由于众所周知的原因导致了谷歌账号同步.扩展商店访问慢甚至打不开的情况. 谷歌访问助手就是用来解决此问题的. ...

  3. JavaScript 错误处理 Throw、Try 和 Catch

    try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. JavaScript 错误 当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错 ...

  4. Git幕后的“故事”

    因为做操作系统实验的原因,所以通读了一遍<Understanding git conceptually>,觉得确实不错,于是就简单地记录一下.有的地方理解的还不是很深,可能不够准确,等抽时 ...

  5. 新版Azure CDN HTTPS加速服务正式上线

    随着网络安全问题日益得到全民重视,HTTPS网络访问协议在互联网访问中得到了广泛的使用.Azure CDN也早在一年前的2015年4月上线了HTTPS加速服务.该加速服务上线一年以来,用户使用量逐渐增 ...

  6. Android输入事件详解

    输入事件 在 Android 系统中,从用户与应用的交互中截获事件的方法不止一种.如考虑截获用户界面内的事件,则可从用户与之交互的特定视图对象中捕获事件. 为此,View 类提供了多种方法. 在您将用 ...

  7. LuaHotUpdate原理

    LuaHotUpdate原理(金庆的专栏)项目地址:https://github.com/asqbtcupid/lua_hotupdate只更新函数,不更新数据.主页上有个动画演示.限Windows平 ...

  8. python地理数据处理库geopy

    http://blog.csdn.net/pipisorry/article/details/52205266 python地理位置处理 python地理编码地址以及用来处理经纬度的库 GeoDjan ...

  9. iOS开发之字数不一的多标签Demo

    有朋友让帮他写一个封装的字数不一的多标签视图,所以今天将代码展示一下,供大家学习 代码中封装了两种方法,分别是:1.传递数组,数组中是NSString类型的方法:2.传递数组,数组中是NSDictio ...

  10. jvm库对nio的处理

    JVM的IO选择 查JVM源码时刚好看到JVM库的一段代码: public static SelectorProvider create() { String osname = AccessContr ...