博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在旋转有序数组内找特定的值
阅读量:7237 次
发布时间:2019-06-29

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

要求

      给定一没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1)。

例如

有序数组为{0,1,2,4,5,6,7},它的一个旋转数组为{4,5,6,7,0,1,2}。

  • 元素6在旋转数组内,返回2
  • 元素3不在旋转数组内,返回-1

 

分析

      遍历一遍,可以轻松搞定,时间复杂度为O(n),因为是有序数组旋转得到,这样做肯定不是最优解。有序,本能反映用二分查找,举个例子看看特点

      可以看出中间位置两段起码有一个是有序的(不是左边,就是右边),那么就可以在有序的范围内使用二分查找;如果不再有序范围内,就到另一半去找。

 

参考代码

int search(int A[], int n, int target) {        int beg = 0;        int end = n - 1;        while (beg <= end)        {            int mid = beg + (end - beg) / 2;            if(A[mid] == target)                return mid;            if(A[beg]  <= A[mid])            {                if(A[beg] <= target && target < A[mid])                    end = mid - 1;                else                     beg = mid + 1;            }            else            {                if(A[mid] < target && target <= A[end])                    beg = mid + 1;                else                    end = mid - 1;            }        }        return -1;    }

 

 

扩展

      上边的有求是没有重复的元素,现在稍微扩展下,可以有重复的元素,其他的要求不变。

 

思路

      大致思路与原来相同,这是需要比较A[beg] 与 A[mid]的关系

  • A[beg]  < A[mid] ————左边有序
  • A[beg]  > A[mid] ————右边有序
  • A[beg]  = A[mid] ————++beg
bool search(int A[], int n, int target) {        int beg = 0;        int end = n - 1;        while (beg <= end)        {            int mid = beg + (end - beg) / 2;            if(A[mid] == target)                 return true;            if(A[beg] < A[mid])            {                if(A[beg] <= target && target < A[mid])                    end = mid - 1;                else                    beg = mid + 1;            }            else if(A[beg] > A[mid])            {                if(A[mid] < target && target <= A[end])                    beg = mid + 1;                else                    end = mid - 1;            }            else                ++beg;        }        return false;    }

 

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3687583.html,如需转载请自行联系原作者

你可能感兴趣的文章
第五周学习总结
查看>>
Oracle高级查询之LAG和LEAD分析函数
查看>>
golang学习的点点滴滴:接口组合
查看>>
【挨踢人物传】frankfan:和自己赛跑的人——不要怕、不后悔!(第九期)
查看>>
anjularjs 第一天
查看>>
HSRP (不同VLAN之间的热备份路由协议)
查看>>
大数据平台一键安装OS【定制化OS镜像制作】
查看>>
git跟踪指定几个文件夹
查看>>
centos服务器到网关丢包(nf_conntrack:table full)
查看>>
Keepalive 之 高可用实现
查看>>
Ansible 之 概念和常用模块介绍
查看>>
Python实例:字典运算:查找字典中的最大最小值
查看>>
git rebase(高级)
查看>>
电信2月国内市场份额52.22% 环比上月下降0.61%
查看>>
6月21日全球域名注册商(国际域名)保有量及市场份额
查看>>
批量设置0777
查看>>
centos6对xen4.2的支持
查看>>
用rsync同步公网centos yum源做本地yum源服务器
查看>>
linux sftp
查看>>
Linux的两种随机数生成器
查看>>