Leetcode問題解--二分検索--区間検索
1636 ワード
[LeetCode]Search for a Range検索範囲
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
For example, Given
この問題は1つの秩序整数配列の中で同じ目標値の開始と終了位置を探して、しかも時間の複雑度をO(logn)に限定して、これは典型的な二分ルックアップ法の時間の複雑度で、だからこの問題は私達もこの方法を使う必要があって、私達の構想はまず元の配列に対して二分ルックアップ法を使うことです
2回の二分法を使用して、最初に左の境界を見つけ、2回目の呼び出しで右の境界を見つければいいです.
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つの秩序整数配列の中で同じ目標値の開始と終了位置を探して、しかも時間の複雑度をO(logn)に限定して、これは典型的な二分ルックアップ法の時間の複雑度で、だからこの問題は私達もこの方法を使う必要があって、私達の構想はまず元の配列に対して二分ルックアップ法を使うことです
2回の二分法を使用して、最初に左の境界を見つけ、2回目の呼び出しで右の境界を見つければいいです.
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] ret = new int[2];
Arrays.fill(ret, - 1);
if(nums.length == 0)
return ret;
int l = 0, h = nums.length - 1;
// , l h ,l l=h = 88888
while(l < h){
int m = l + (h-l) / 2;
if(nums[m] < target){
l = m + 1;
}
else
h = m;
}
// l=h != target target target
if(nums[h] != target)
return ret;【-1, -1】
ret[0] = h;
h = nums.length;
// h 888899 h 9
//l 8-8-8-8-9
while(l < h){
int m = l + (h - l) / 2;
if(nums[m] > target)
h = m;
else
l = m + 1;
}
ret[1] = l - 1; //
return ret;
}
}