【LeetCode】Search For A Range 区间搜索[二分法]
来源:互联网 发布:张予曦淘宝店的模特 编辑:程序博客网 时间:2024/06/08 00:45
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
挑战
时间复杂度 O(log n)
标签
二分法 数组 排序数组
相关题目
中等 Range Sum Query 2D - Immutable 30 %
SOLUTION 1:
使用改进的二分查找法。终止条件是:left + 1 < right 这样结束的时候,会有2个值供我们判断。这样做的最大的好处是,不用处理各种越界问题。
- 先找左边界。当mid == target,将right移动到mid,继续查找左边界。
最后如果没有找到target,退出 - 再找右边界。当mid == target,将left移动到mid,继续查找右边界。
最后如果没有找到target,退出
(1)Java
public class Solution { /* * @param A: an integer sorted array * @param target: an integer to be inserted * @return: a list of length 2, [index1, index2] */ public int[] searchRange(int[] A, int target) { if(A.length == 0){ return new int[]{-1,-1}; } int start, end, mid; int[] bound = new int[2]; //因为是排序数组,无需考虑target中夹杂某数的情况 //search for left bound: start = 0; end = A.length - 1; while(start + 1 < end){ mid = start + (end - start) / 2; if(A[mid] == target){ end = mid; }else if(A[mid] < target){ start = mid; }else{ //if (A[mid] > target) end = mid; } } if(A[start] == target){ bound[0] = start; }else if(A[end] == target){ bound[0] = end; }else{ bound[0] = bound[1] = -1; return bound; } //search for ringht bound start = 0; end = A.length - 1; while(start + 1 < end){ mid = start + (end - start) / 2; if(A[mid] == target){ start = mid; }else if(A[mid] < target){ start = mid; }else{ //if (A[mid] > target) end = mid; } } if(A[end] == target){ bound[1] = end; }else if(A[start] == target){ bound[1] = start; }else{ bound[0] = bound[1] = -1; return bound; } return bound; }}
(2)C++
class Solution { /** *@param A : an integer sorted array *@param target : an integer to be inserted *return : a list of length 2, [index1, index2] */public: vector<int> searchRange(vector<int> &A, int target) { // write your code here vector<int> ans; int ansl = -1; for (int l = 0, r = A.size() - 1; l <= r;) { int mid = l + (r - l) / 2; if (A[mid] > target) { r = mid - 1; } if (A[mid] < target) { l = mid + 1; } if (A[mid] == target) { ansl = mid; r = mid - 1; } } int ansr = -1; for (int l = 0, r = A.size() - 1; l <= r;) { int mid = l + (r - l) / 2; if (A[mid] > target) { r = mid - 1; } if (A[mid] < target) { l = mid + 1; } if (A[mid] == target) { ansr = mid; l = mid + 1; } } ans.push_back(ansl); ans.push_back(ansr); return ans; }};
阅读全文
1 0
- 【LeetCode】Search For A Range 区间搜索[二分法]
- LeetCode Search for a Range(二分法)
- 搜索一个区间:Search for a Range
- Search for a Range 区间搜索
- [Lintcode]Search for a Range搜索区间
- [LeetCode] Search for a Range查找区间
- LeetCode-34-Search for a Range(二分法)-Medium
- 二分法求解Leetcode 34. Search for a Range
- 61.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] Search for a Range
- LeetCode : Search for a Range
- [LeetCode] Search for a Range
- [Leetcode] Search for a Range
- Leetcode Search for a Range
- LitePal简单用法
- IT热门技能
- 深入分析Java的序列化与反序列化
- 制作UTF8转GB2312转换库
- Solr报错-503-Server is shutting down or failed to initialize
- 【LeetCode】Search For A Range 区间搜索[二分法]
- 助力全国双创周,天英汇领衔打造区域创新新势力
- word中页眉页码使用真谛
- canvas绘制七巧板
- 单例与序列化的那些事儿
- 使用Java中的Try-With-Resource
- Ruby魅力之旅
- JavaWeb
- 错误使用Handler引发的内存泄露