LeetCode 34 Search For A Range 二叉查找相关(二)
2015-03-10 00:07
549 查看
题目:
https://leetcode.com/problems/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
return
最直接的想法就是先二叉查找到target的一个index,然后再往左往右分别查找边界,这样实际上有三遍二叉查找,代码如下:
提交之后发现运行时间排在JAVA类的靠后,有没有优化的空间呢?
发现其实并不需要先找到一个Index之后再找左右的边界,可以一遍二叉查找左边界,再来一次查找右边界,代码如下:
https://leetcode.com/problems/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
[-1, -1].
For example,
Given
[5, 7, 7, 8, 8, 10]and target value 8,
return
[3, 4].
最直接的想法就是先二叉查找到target的一个index,然后再往左往右分别查找边界,这样实际上有三遍二叉查找,代码如下:
public class Solution { public int[] searchRange(int[] A, int target) { int[] result = {-1, -1}; if (A == null || A.length == 0) { return result; } int l = 0; int r = A.length - 1; boolean hasTarget = false; int mid = (l + r) / 2; while (l <= r) { mid = (l + r) / 2; if (A[mid] == target) { hasTarget = true; break; } else if (A[mid] < target) { l = mid + 1; } else { r = mid -1; } } if (!hasTarget) { return result; } // at this point, A[mid] = target, then need to find the range // 1. find left range l = 0; r = mid; result[1] = mid; while (l <= r) { mid = (l + r) / 2; if (A[mid] == target) { r = mid - 1; } else { // must be less than target l = mid + 1; } } result[0] = l; // 2. find right range l = result[1]; r = A.length - 1; while (l <= r) { mid = (l + r) / 2; if (A[mid] == target) { l = mid + 1; } else { // must be great than target r = mid - 1; } } result[1] = r; return result; } }
提交之后发现运行时间排在JAVA类的靠后,有没有优化的空间呢?
发现其实并不需要先找到一个Index之后再找左右的边界,可以一遍二叉查找左边界,再来一次查找右边界,代码如下:
public class Solution { public int[] searchRange(int[] A, int target) { int[] result = {-1, -1}; if (A == null || A.length == 0) { return result; } int l = 0; int r = A.length - 1; // 1. find left range while (l <= r) { int mid = (l + r) / 2; if (A[mid] >= target) { r = mid - 1; } else { l = mid + 1; } } if (l >= A.length || A[l] != target) { // not found return result; } result[0] = l; // 2. find right range r = A.length - 1; while (l <= r) { int mid = (l + r) / 2; if (A[mid] == target) { l = mid + 1; } else { // must be great than target r = mid - 1; } } result[1] = r; return result; } }
相关文章推荐
- leetcode_34——Search for a Range(二分查找)
- [leetcode-二分查找]--34. Search for a Range
- LeetCode 34 Search for a Range (有序数组中查找给定数字的起止下标)
- [leetcode] 【查找】 34. Search for a Range
- LeetCode 34. Search for a Range(有序数组,查找给定值范围)
- leetcode 34. Search for a Range (二分查找)
- leetcode 34. Search for a Range 二分查找
- Leetcode刷题记——34. Search for a Range(查找一个范围)
- LeetCode-----34. Search for a Range(查找范围)
- [LeetCode] Search for a Range [34]
- LeetCode 34 Search for a Range
- leetcode题解:Search for a Range (已排序数组范围查找)
- [LeetCode]34.Search for a Range
- leetcode[34]Search for a Range
- LeetCode_34---Search for a Range
- Leetcode_34_Search for a Range
- leetcode:Search for a Range 二分查找
- leetcode-34 Search for a Range
- LeetCode 35 Search Insert Position 二叉查找相关(一)
- [Leetcode] 34. Search for a Range