Search for a Range
来源:互联网 发布:西门子200plc编程实例 编辑:程序博客网 时间:2024/06/06 02:14
原题:
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
二分查找
代码1:
public int[] searchRange(int[] A, int target) { int[] result = new int[2]; result[0] = -1; result[1] = -1; if(A==null || A.length<1) { return result; } result[0] = findLeft(A, target); result[1] = findRight(A, target); return result; }private int findLeft(int[] A, int target) {int result = 0;int left = 0; int right = A.length-1; int middle; while(left <= right) { if( A[left]==target&&(left==0||A[left-1]!=target) ) { return left; } middle = left + (right-left)/2; if(A[middle]==target) { if( (middle==0||A[middle-1]!=target) ) { return middle; } else { right = middle-1; } } else if(A[middle]<target) { left = middle+1; } else { right = middle-1; } }return result;}private int findRight(int[] A, int target) {int result = 0;int left = 0; int right = A.length-1; int middle; while(left <= right) { if( A[right]==target&&(right==A.length-1 || A[right+1]!=target)) { return result; } middle = left + (right-left)/2; if(A[middle]==target) { if( (middle==A.length-1||A[middle+1]!=target) ) { return middle; } else { left = middle+1; } } else if(A[middle]<target) { left = middle+1; } else { right = middle-1; } }return result;}
另一种写法:
public int[] searchRange(int[] A, int target) { int[] result = new int[2]; result[0] = -1; result[1] = -1; if(A==null || A.length<1) { return result; } int left = 0; int right = A.length-1; int middle; while(left<=right) { middle = left + (right-left)/2; if(A[middle]<target) { left = middle+1; } else if(A[middle]>target) { right = middle-1; } else { result[0] = lowerBound(A, left, middle-1, target); result[1] = upperBound(A, middle+1, right, target); return result; } } return result; }private int lowerBound(int[] A, int left, int right, int target) {while(left<=right) {int middle = left + (right-left)/2;if(A[middle]<target) {left = middle+1;} else {right = middle-1;}}return right+1;}private int upperBound(int[] A, int left, int right, int target) {while(left<=right) {int middle = left + (right-left)/2;if(A[middle]<=target) {left = middle+1;} else {right = middle-1;}}return left-1;}
0 0
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range !!!
- Search for a Range
- Search for a Range
- Search For A Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- 字符串循环右移
- 毕业后就职第二月 碎碎念(一)
- C# 查找EXCEL的两种方法比较
- linux 建立设备文件
- java通过jni调用c库
- Search for a Range
- c++ primer(第五版)笔记 第九章 顺序容器(2)
- LDA-math-MCMC 和 Gibbs Sampling
- 黑马程序员——流程控制语句
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- Zabbix如何监控Windows机器
- Prefab动态修改无效的解决方案
- sprintf,你知道多少?
- 【算法导论学习-27】动态规划经典问题01:钢条切割的最大收益