博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CareerCup] 9.3 Magic Index 魔法序号
阅读量:7026 次
发布时间:2019-06-28

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

 

9.3 A magic index in an array A[0.. .n-1] is defined to be an index such that A[i] = i. Given a sorted array of distinct integers, write a method to find a magic index, if one exists, in array A.

FOLLOW UP
What if the values are not distinct?

 

这道题定义了一个魔法序号,就是一个数组的序号等于该位置的值的时候,这个序号就是魔法序号,给了我们一个有序数组,让我们来找魔法序号。这里brute force的方法就不提了,因为没啥考察的目的,对于高效的查找方法我们就要首先考虑二分搜索法,首先我们来看这种方法,没啥特别的地方,套用一般的二分查找法的格式即可,参见代码如下:

 

class Solution {public:    int getMagicIdx(vector
&nums) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == mid) return mid; else if (nums[mid] > mid) right = mid - 1; else left = mid + 1; } return -1; }};

 

这道题的Follow up是说如果数组由重复项怎么处理,那么传统的二分搜索法就会失效,因为下列这种情况可能存在:

-10 -5 2 2 2 3 4 7 9 12 13
0 1 2 3 4 5 6 7 8 9 10

这种情况符合题意,但是左右两边都会出现魔法序号,所以二分查找法会失效。那么我们难道又要用地毯式搜索了么,其实也不必,我们可以用一种类似于二分搜索法的递归方法来解决问题,就拿上面那个例子来说,第一次找到比较完中间点后,由于左右两边都会出现答案,所以我们左右半段要分别递归一下,这里我们可以加一个trick来优化算法,比如要递归左半段时,那么新的右边界就可以设为min(mid - 1, nums[mid]),同理递归右半段时,左边界可以设为max(mid + 1, nums[mid])。还有个小trick,就是如果左半段搜到了答案,那么直接返回即可,不用再搜右半段,因为题目让我们找一个就行了,没说要找出所有的Magic index,参见代码如下:

 

// Follow upclass Solution {public:    int getMagicIdx(vector
&nums) { return getMagicIdxDFS(nums, 0, nums.size() - 1); } int getMagicIdxDFS(vector
&nums, int start, int end) { if (end < start) return -1; int mid = (start + end) / 2; if (mid == nums[mid]) return mid; int left = getMagicIdxDFS(nums, start, min(mid - 1, nums[mid])); if (left >= 0) return left; int right = getMagicIdxDFS(nums, max(mid + 1, nums[mid]), end); return right; }};

 

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

你可能感兴趣的文章
NETWORK笔记2:数制、符号、转换
查看>>
简单的模拟小型公司网络配置实验
查看>>
初识 Knative: 跨平台的 Serverless 编排框架
查看>>
Spark in action on Kubernetes - Spark Operator的原理解
查看>>
实现 base64+gzip+AES-ECB加密解密
查看>>
网易云音乐下载|网易云音乐电脑版下载
查看>>
linux 主机名常忽略的小问题
查看>>
Lock wait timeout exceeded; try restarting tran...
查看>>
存储过程优势
查看>>
2012年4月MVP申请截止时间:2012年1月12日
查看>>
mydns的安装
查看>>
tar增量备份
查看>>
xen 故障汇总
查看>>
SecureCRT的使用--增加队列
查看>>
搭建gitlab
查看>>
linux常用命令-cd/type/printenv/hash
查看>>
python第二章 变量
查看>>
数据中心虚拟化需要大二层网络
查看>>
在Exchange server 2007中管理pop3和IMAP4协议访问
查看>>
后台在线编辑模板禁止提交含有{php 的标签解决办法
查看>>