[LeetCode]34. Search for a Range
来源:互联网 发布:如何把分开的数据整合 编辑:程序博客网 时间:2024/06/15 17:07
Description
Given an array of integers sorted in ascending order, 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].
Example
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
Discussion
查找目标在一个有序整数数组中的起止位置。算法的时间复杂度要求在O(logn)。
这个问题和在一个有序数组中查找元素类似。我们可以采用二分查找法分两次查找。第一次查找起始位置,第二次查找结束位置。只不过需要在判断的时候稍作改变。
查找起始位置的时候,如果中间元素小于目标元素,就在右侧查找,否则在左侧查找。(这里与查找一个元素不同的是中间元素等于目标元素的情况,如果中间元素等于目标元素,则在左侧查找。)
查找结束位置的时候,如果中间元素大于目标元素,就在左侧查找,否在在右侧查找。
算法的时间复杂度为O(logn)
。
C++ Code
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> answer = {-1, -1}; if(nums.size() == 0) { return answer; } answer[0] = searchStart(nums, target, 0, nums.size() - 1); answer[1] = searchEnd(nums, target, 0, nums.size() - 1); return answer; } /** **查找起始位置 **/ int searchStart(vector<int> & nums, int target, int leftPos, int rightPos) { if(nums[leftPos] == target) { return leftPos; } if(rightPos - leftPos < 1) { return -1; } int middlePos = (leftPos + rightPos) / 2; if(nums[middlePos] < target) { return searchStart(nums, target, middlePos + 1, rightPos); } else { return searchStart(nums, target, leftPos, middlePos); } } /** **查找结束位置 **/ int searchEnd(vector<int> & nums, int target, int leftPos, int rightPos) { if(nums[rightPos] == target) { return rightPos; } if(rightPos - leftPos < 1) { return -1; } int middlePos = (leftPos + rightPos + 1) / 2; if(nums[middlePos] > target) { return searchEnd(nums, target, leftPos, middlePos - 1); } else { return searchEnd(nums, target, middlePos, rightPos); } return -1; }};
阅读全文
0 0
- [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 OJ> 34. Search for a Range
- 34. Search for a Range LeetCode
- [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
- 网络协议,端口定义等相关内容
- Java编程思想——对象导论
- SpringBoot开发详解(三)--SpringBoot配置文件YML注意事项
- Spring Data JPA的懒加载问题
- PullToRefreshScrollView 整体刷新的使用
- [LeetCode]34. Search for a Range
- linux命令集
- Tensorflow卷积神经网络
- Fragment学习之findFragmentById的使用
- C语言———指针
- Myeclipse自动生成返回值对象的快捷键
- Animation动画(二)---- Frame 帧动画
- Failed to sync Gradle project'xxxx' error:Re-downlod....
- hdu 5475(线段树(锻炼思维))