Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置
2016-06-11 14:35
501 查看
问题描述:给定一个有序序列,找到指定元素的起始和结束位置。例如:1234555,5,起始4结束6
算法分析:其实就是一个二分查找的利用。但是特殊就在不是找到某个元素,而是找到下标。也就是在nums[mid]=target时,要分析mid的左右元素。
算法分析:其实就是一个二分查找的利用。但是特殊就在不是找到某个元素,而是找到下标。也就是在nums[mid]=target时,要分析mid的左右元素。
public int[] searchRange(int[] nums, int target) { if(nums == null || nums.length == 0) { return null; } int[] arr = {-1,-1}; binarySearch(nums, 0, nums.length - 1, target, arr); return arr; } public void binarySearch(int[] nums, int left, int right, int target, int[] arr) { int mid = (left + right)/2; if(left > right) { return; } if(nums[left] == target && nums[right] == target)//特例 { arr[0] = left; arr[1] = right; return; } if(nums[mid] == target) { int templ = mid, tempr = mid; while(templ>=left && nums[templ]==target) { templ --; } arr[0] = templ+1; while(tempr<=right && nums[tempr]==target) { tempr ++; } arr[1] = tempr-1; } else if(nums[mid] < target) { binarySearch(nums, mid + 1, right, target, arr); } else { binarySearch(nums, left, mid - 1, target, arr); } }
相关文章推荐
- svn is already under version control问题解决
- [Java] 修饰符 public/private/protected 的具体区别
- linux select()详解( 四)-- Unix域字节流最简实例
- jQuery 对dom的操作
- DIV居中显示
- 【无线传感网】:无线传感网复习
- 新博客地址
- [置顶]在linux中连接wifi
- [置顶]磁盘分区以及解决反序安装操作系统所带来的困扰
- 2016计蒜之道-初赛-第四场-A-淘宝流量分配
- 将博客搬至CSDN
- DIV垂直居中
- CenOS下firefox browser (火狐浏览器)无法播放网页音乐的解决方法
- c++之string.find(string)
- c++错误代码1
- 构建之法阅读笔记05
- 获取月的第一天和最后一天的日期
- Java基本特征
- Shell脚本编程之函数
- Java for Web学习笔记(二一):EL(1)什么是EL