LeetCode Search for a Range

来源:互联网 发布:果壳网 知乎 编辑:程序博客网 时间:2024/06/06 17:21

题目:

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,-1]。题目很好理解,而且因为看到了已经排好序,所以考虑用二分搜索,这是关键,找出具体的那个数的位置,然后找到后还得看这个数的位置,如果是在开头,那么只要从后面开始找,看看有没有了;如果是在结尾,那么向前找,如果是在中间,则采用夹逼,从两头开始夹,看是否有相同的,然后再返回。思路还是很简单的,主要是二分搜索法的应用,要回熟练地写,二分搜索法的关键是,一开始要判断start <= end,这是用递归做二分搜索的关键。

public int[] searchRange(int[] nums,int target){int[] result = new int[2];result[0] = -1;result[1] = -1;int length = nums.length;if(nums == null || nums.length == 0){result[0] = -1;result[1] = -1;return result;}if(nums.length == 1 && nums[0] == target){result[0] = 0;result[1] = 0;return result;}else if(nums.length == 1 && nums[0] != target){result[0] = -1;result[1] = -1;return result;}int num = binarySearch(nums,target,0,length - 1);if(num == -1){result[0] = -1;result[1] = -1;}else{if(num == 0){int i = 0;for(i = 0; i < length; i++){if(nums[i] != nums[num])break;}result[0] = num;result[1] = i - 1;}else if(num == length - 1){int i = length - 1;while(i >= 0){if(nums[i] != nums[num])break;i--;}i++;result[0] = i;result[1] = num;}else{int i = num;int j = num;while(i <= length - 1){if(nums[i] != nums[num])break;i++;}while(j >= 0){if(nums[j] != nums[num])break;j--;}j++;i--;result[0] = j;result[1] = i;}}return result;}public int binarySearch(int[] nums,int target,int start,int end){    if(start <= end){    int mid = (start + end) / 2;    if(nums[mid] == target)    return mid;    if(nums[mid] < target)    return binarySearch(nums,target,mid + 1,end);    else if(nums[mid] > target)    return binarySearch(nums,target,start,mid - 1);}return -1;}


0 0