解析一道百度面试算法题目
2016-02-02 00:00
501 查看
摘要: 基于二分查找扩展的算法题目
题目:给定一列有序数组,元素有多个重复值,如[1,1,2,3,3,8,8],求查找元素的最左位置,如存在返回在数组中的下标,不存在返回-1。
思路一
咋看这是一个二分查找的问题,但是又有所不同,因为二分查找的结果可能查找到重复元素的一个随机的位置,而不是最左位置。
最简单的想法就是用二分查找,找到元素后在向左遍历,直到找到不相同的元素位置。
代码示例:
思路二
二分查找的思路就是每次将查找区间缩小一半,直到最后找到结果,那么将这个思路延伸一下解决本题问题:将区间无线聚合缩小,直到最后相邻的两个元素,那么在对这两个元素进行简单判断就可以了。
代码示例:
如果你有更好的解法,欢迎留言探讨。
题目:给定一列有序数组,元素有多个重复值,如[1,1,2,3,3,8,8],求查找元素的最左位置,如存在返回在数组中的下标,不存在返回-1。
思路一
咋看这是一个二分查找的问题,但是又有所不同,因为二分查找的结果可能查找到重复元素的一个随机的位置,而不是最左位置。
最简单的想法就是用二分查找,找到元素后在向左遍历,直到找到不相同的元素位置。
代码示例:
// 二分查找最左元素 function binSearchLeft($arr, $key) { $low = 0; $high = count($arr) - 1; while ($low + 1 != $high) { $mid = intval(($high + $low) / 2); if($arr[$mid] == $key){ //向左遍历找到最左的元素 while($arr[$mid-1] == $arr[$mid]) { $mid--; } return $mid; } else if($arr[$mid] > $key){ $high = $mid + 1; } else { $low = $mid - 1; } } return -1; } 算法复杂度:O(n/2)
思路二
二分查找的思路就是每次将查找区间缩小一半,直到最后找到结果,那么将这个思路延伸一下解决本题问题:将区间无线聚合缩小,直到最后相邻的两个元素,那么在对这两个元素进行简单判断就可以了。
代码示例:
// 聚合查找区间查找最左元素 function findLeft($arr, $key) { $low = 0; $high = count($arr) - 1; while ($low + 1 != $high) { $mid = intval(($high + $low) / 2); if($arr[$mid] >= $key){ $high = $mid; } else { $low = $mid; } } if($arr[$high] == $key) { return $arr[$low] == $arr[$high] ? $low : $high; } return -1; } 算法复杂度:O(?) <= O(n/2),算法上更优
如果你有更好的解法,欢迎留言探讨。
相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- C++二分查找在搜索引擎多文档求交的应用分析
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法