Search for a Range

本文介绍了一种使用两次二分查找的方法来确定给定排序数组中目标值的起始和结束位置。通过两个独立的二分查找过程分别定位目标值的左边界和右边界,从而高效地解决了问题。

Given a sorted array of n integers, find the starting and ending position of a given target value.

If the target is not found in the array, return [-1, -1].

Example

Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

思路:二分查找。使用两次二分查找。第一次找到第一个等于target的数组下标,第二次找到最后一个等于target的数组的下标。
 1 public class Solution {
 2     public int[] searchRange(int[] A, int target) {
 3         if (A.length == 0) {
 4             return new int[]{-1, -1};
 5         }
 6         
 7         int start, end, mid;
 8         int[] bound = new int[2]; 
 9         
10         // search for left bound
11         start = 0; 
12         end = A.length - 1;
13         while (start + 1 < end) {
14             mid = start + (end - start) / 2;
15             if (A[mid] == target) {
16                 end = mid;
17             } else if (A[mid] < target) {
18                 start = mid;
19             } else {
20                 end = mid;
21             }
22         }
23         if (A[start] == target) {
24             bound[0] = start;
25         } else if (A[end] == target) {
26             bound[0] = end;
27         } else {
28             bound[0] = bound[1] = -1;
29             return bound;
30         }
31         
32         // search for right bound
33         start = 0;
34         end = A.length - 1;
35         while (start + 1 < end) {
36             mid = start + (end - start) / 2;
37             if (A[mid] == target) {
38                 start = mid;
39             } else if (A[mid] < target) {
40                 start = mid;
41             } else {
42                 end = mid;
43             }
44         }
45         if (A[end] == target) {
46             bound[1] = end;
47         } else if (A[start] == target) {
48             bound[1] = start;
49         } else {
50             bound[0] = bound[1] = -1;
51             return bound;
52         }
53         
54         return bound;
55     }
56 }

 

转载于:https://www.cnblogs.com/FLAGyuri/p/5370647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值