34 Search for a Range
2016-05-31 22:25
477 查看
利用原数组中的元素是有序的,对数组进行二分,例如Given
若找到的序列ele[lo]==ele[hi]&&ele[lo]==target,说明这[lo,hi]区间的元素都为target,二分的结果有四种
1. 左边找到+右边找到,因为数组有序,找到的区间一定相邻! 这时候合并一下取 left=左边left ,right=右边right即可。
2. 左边找到+右边没找到,返回左边区间
3. 左边没找到+右边找到,返回右边区间
4. 左边没找到+右边没找到,返回[-1,-1]
注意以上情况均为迭代处理。
[5, 7, 7, 8, 8, 10]and target value 8,
若找到的序列ele[lo]==ele[hi]&&ele[lo]==target,说明这[lo,hi]区间的元素都为target,二分的结果有四种
1. 左边找到+右边找到,因为数组有序,找到的区间一定相邻! 这时候合并一下取 left=左边left ,right=右边right即可。
2. 左边找到+右边没找到,返回左边区间
3. 左边没找到+右边找到,返回右边区间
4. 左边没找到+右边没找到,返回[-1,-1]
注意以上情况均为迭代处理。
public int[] searchRange(int[] nums, int target) { return searchaux(nums, target, 0, nums.length-1); } public int[] searchaux(int[] nums,int target,int lo,int hi) { if(nums[lo]==nums[hi]&&nums[lo]==target) return new int[] {lo,hi}; if(lo==hi) return new int[] {-1,-1}; int mid=(lo+hi)>>1; int[] lret=searchaux(nums, target, lo, mid); int[] rret=searchaux(nums, target, mid+1, hi); int leftindex=-1; int rightindex=-1; if(lret[0]>=0&&rret[0]>=0) { leftindex=lret[0]; rightindex=rret[1]; } else if(lret[0]>=0) { leftindex=lret[0]; rightindex=lret[1]; } else if(rret[0]>=0) { leftindex=rret[0]; rightindex=rret[1]; } return new int[] {leftindex,rightindex}; }
相关文章推荐
- Java对象的序列化
- 【原创:毕业意味着什么】
- 多进程的网络服务的一般模型
- Android TextView如何显示html样式的文字
- 【DevOps敏捷开发动手实验】开源文档 v2015.2 stable 版发布
- MongoDB快速入门学习笔记6 MongoDB的文档删除操作
- 二进制中有多少个1
- 文章标题
- 新的开始
- CodeForces-17A-Noldbach problem
- leetcode-25-Reverse Nodes in k-Group
- iptables (2) 基本配置
- STM32F0xx_ADC采集电压配置详细过程
- 关于ORA-00257问题的解决(归档程序错误)
- 冲刺 09
- 看见的力量 – (II) 影响地图
- DP 动态规划 Problem V 1022 反向考虑的背包
- ajax跨域请求简单实现Java后台
- [置顶] 给大家推荐一个神奇的文献搜索网站sci-hub
- 开发 JAVA 的准备