博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode第一刷_Search in Rotated Sorted Array
阅读量:6197 次
发布时间:2019-06-21

本文共 1181 字,大约阅读时间需要 3 分钟。

旋转数组的查找问题。从头開始扫一遍。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);    }};

转载地址:http://lvjca.baihongyu.com/

你可能感兴趣的文章
awk报告生成器
查看>>
Mysql多实例运行
查看>>
Python的pass语句
查看>>
inotifywait
查看>>
RIP协议
查看>>
Linux基础系列(五)Linux系统文件删除原理
查看>>
MVC5 DB FIRST
查看>>
文件与文件系统的压缩与打包
查看>>
磁盘的性能影响着mysql连接数(请使用火狐浏览器浏览本页面,否则图片不显示)...
查看>>
视野和希望的对话
查看>>
修改eclipse默认工作空间和删除工作空间
查看>>
Egret之EUI及龙骨基础
查看>>
Ubuntu16.04安装Docker 入门
查看>>
有限算法下的技术实现路线
查看>>
启动和内核管理
查看>>
用php如何快速将字符串切分成数组
查看>>
使用distribute-list配置路由选择更新
查看>>
理解Oracle在AIX平台上的内存使用
查看>>
python类的使用
查看>>
http code 返回码
查看>>