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 [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
分析:题意为在一个有序数组中找到给定目标值的起始位置并返回,如果目标值不存在则返回[1,1].
思路:使用binarySearchLow()去找到不小于目标值数字的最小索引,使用binarySearchUp()去找到不大于目标值数字的最大索引,然后即可得到索引范围。
code如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Solution { private : int binarySearchLow(vector< int >& nums, int target, int begin, int end) { if (begin > end) return begin; int mid = begin + (end - begin) / 2; if (nums[mid] < target) return binarySearchLow(nums, target, mid + 1, end); else return binarySearchLow(nums, target, begin, mid - 1); } int binarySearchUp(vector< int >& nums, int target, int begin, int end) { if (begin > end) return end; int mid = begin + (end - begin) / 2; if (nums[mid] > target) return binarySearchUp(nums, target, begin, mid - 1); else return binarySearchUp(nums, target, mid + 1, end); } public : vector< int > searchRange(vector< int >& nums, int target) { vector< int > res(2, -1); if (nums.empty()) return res; int high = binarySearchUp(nums, target, 0, nums.size() -1); int low = binarySearchLow(nums, target, 0, nums.size() - 1); if (high >= low) { res[0] = low; res[1] = high; return res; } return res; } }; |
其他方法:先找到有序数组中与目标值相同的数字的位置,然后检查其个数.
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class Solution { public : vector< int > searchRange(vector< int >& nums, int target) { int low=0; int high=nums.size()-1; vector< int > ans(2,-1); int flag=-1; //数组中是否存在与目标值相同数字的标志 int start,end; while (low<=high){ int mid=(low+high)/2; if (nums[mid]<target){ low=mid+1; } else if (nums[mid]>target){ high=mid-1; } else { flag=mid; break ; } } if (flag!=-1){ start=flag; while (start>=0 && nums[start]==target){ start--; } ans[0]=start+1; end=flag; while (end < nums.size() && nums[end]==target){ end++; } ans[1]=end-1; } return ans; } }; |
其他解法:解决问题的短代码(使用迭代器)
1 2 3 4 5 6 7 8 9 10 | class Solution { public : vector< int > searchRange(vector< int >& nums, int target) { vector< int > ret; vector< int >::iterator start = find(nums.begin(), nums.end(), target); vector< int >::reverse_iterator end = find(nums.rbegin(), nums.rend(), target); ret.push_back( (start == nums.end() ? -1 : start-nums.begin() ) ),ret.push_back(nums.size() - 1 - (end - nums.rbegin())); return ret; } }; |
python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Solution(object): def searchRange(self, nums, target): "" " :type nums: List[ int ] :type target: int :rtype: List[ int ] "" " if target not in nums: return ([-1,-1]) low = nums.index(target) nums.sort(reverse=True) high = len(nums)-nums.index(target)-1 result = [] result.append(low) result.append(high) return (result) |
朱颜辞镜花辞树,敏捷开发靠得住!
分类:
leetcode刷题
标签:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理