旋转数组的查找问题。从头開始扫一遍。O(N)的复杂度,一般也能过,甚至先排序下面,再二分都能过。只是这道题的目的当然不在于此。

想一下旋转之后对我们的查找产生了什么影响。假设没旋转过,我们直接比較target与A[middle]的大小,然后总能很确定的丢掉源数组的一半。即把搜索空间减半,可是旋转之后,仅仅依据A[middle]是确定不了下一轮的走向的,由于即使A[middle]比target大,按理说我们应该往前找,可是假设源数组是循环左移的。较小的数可能在后半部分。

上面说的都是旋转之后与没旋转的差别,这个是非常easy想明确的,关键是旋转之后有什么没有变化呢?答案是不管怎么旋转,middle的左右部分肯定至少有一个是全然有序的。这个应该好理解。

怎么推断这一半是哪一半也非常简单。仅仅要看A[middle]跟A[0]和A[N]的大小关系就能够了。假设有序,我们就能够通过比較端点与target的大小来确定target应不应当在这一部分,假设不在的话,就递归查询还有一半。依据这个策略,就能够每次确定的丢掉一半了。时间复杂度也就降下来了。

不要忘记这个题有非常强的如果,数组中没有反复的元素,有反复元素的非常不一样。是下一道题的内容。

int msearch(int A[], int n, int target, int* a){
if(n<=0)
return -1;
int middle = n/2;
if(A[middle] == target)
return A-a+middle;
if(A[middle]>target){
if(A[0]<=target||A[0]>A[middle]){
return msearch(A, middle, target, a);
}else{
return msearch(A+middle+1, n-middle-1, target, a);
}
}else{
if(A[0]<=A[middle]||A[n-1]>=target)
return msearch(A+middle+1, n-middle-1, target, a);
else{
return msearch(A, middle, target, a);
}
}
} class Solution {
public:
int search(int A[], int n, int target) {
return msearch(A, n, target, A);
}
};

leetcode第一刷_Search in Rotated Sorted Array的更多相关文章

  1. 【一天一道LeetCode】#81. Search in Rotated Sorted Array II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

  2. 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array

    乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言     将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...

  3. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  4. 【leetcode】Find Minimum in Rotated Sorted Array I&&II

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

  5. 【leetcode】Find Minimum in Rotated Sorted Array II JAVA实现

    一.题目描述 Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed ...

  6. [Leetcode][Python]33: Search in Rotated Sorted Array

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 33: Search in Rotated Sorted Arrayhttps ...

  7. LeetCode题解33.Search in Rotated Sorted Array

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

  8. LeetCode解题报告—— Search in Rotated Sorted Array & Search for a Range & Valid Sudoku

    1. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated(轮流,循环) at so ...

  9. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

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

随机推荐

  1. C#线程锁使用全功略

    C#线程锁使用全功略 前两篇简单介绍了线程同步lock,Monitor,同步事件EventWaitHandler,互斥体Mutex的基本用法,在此基础上,我们对 它们用法进行比较,并给出什么时候需要锁 ...

  2. 基于Redis的三种分布式爬虫策略

    前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...

  3. quilt-补丁工具

    参考:https://blog.csdn.net/adomwon/article/details/79047059 前言: 在查找openwrt中samba编译报错问题时直到了quilt这个工具,为了 ...

  4. 根据Dockerfile创建hello docker镜像

    一.编写hello可执行c文件: 1.安装:gcc glibc glibc-static yum install -y gcc glibc glibc-static 2.编写hello.c:vim h ...

  5. Python数据类型方法

    Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...

  6. LeetCode(4)Median of Two Sorted Arrays

    题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  7. UVa 1600 Patrol Robot(BFS)

    题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...

  8. 【BZOJ2818】Gcd(莫比乌斯反演,欧拉函数)

    题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对 1<=N<=10^7 思路:莫比乌斯反演,同BZOJ2820…… ; ..max]of ...

  9. 【ZJOI2017 Round1练习&BZOJ5354】D7T3 room(DP)

    题意: 思路: 写了两种版本 考场版本 ..,..]of longint; t:..,..]of longint; n,m,i,j,k,oo,ans,d1:longint; function min( ...

  10. 【Java集合】Java中集合(List,Set,Map)

    简介: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集 ...