LeetCode 34 Search For A Range 二叉查找相关(二)
来源:互联网 发布:大数据主要应用领域 编辑:程序博客网 时间:2024/06/07 07:05
题目:
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; }}
0 0
- LeetCode 34 Search For A Range 二叉查找相关(二)
- [LeetCode] Search for a Range查找区间
- leetcode:Search for a Range 二分查找
- leetcode 二分查找 Search for a Range
- leetcode-二分查找:Search for a range
- [leetcode] 【查找】 34. Search for a Range
- leetcode---search-for-a-range---查找
- LeetCode(34)Search for a Range
- LeetCode (34)Search for a Range
- LeetCode 之 Search for a Range(查找)
- Leetcode-Search for a Range(折半查找)
- LeetCode(34)Search for a Range
- [LeetCode] Search for a Range [34]
- LeetCode 34 Search for a Range
- [leetcode 34] Search for a Range
- Leetcode NO.34 Search for a Range
- [LeetCode 34]Search for a Range
- leetcode-34 Search for a Range
- Android SDK开发包国内下载地址
- Windows7下QT5开发环境搭建
- cocos2dx 3.4适配
- 我的Android学习之旅[3]——从简单的Hello World来剖析项目结构
- 分享一种兼具UD、U+V2高端隐藏,支持UEFI和4GB大文件的U启制作思路
- LeetCode 34 Search For A Range 二叉查找相关(二)
- 【Android基础】Activity的启动模式(android:launchMode)
- Linux kernel coding style
- 我的Android学习之旅[4]——Android应用程序的生命周期
- 我的Android学习之旅[5]——分析一个闪屏的Android示例程序
- Java虚拟机工作原理详解
- 用C语言实现最小二乘法算法
- c语言3月10日学习总结
- 【收藏】关于虚拟机VMWare 9.0 相关问题