2020/12/01
今天是努力入门c++的Jimmy!
初学c++的第一题。
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目知识点
- C++数组vector的使用(非必需
- 已排序数组的快速查找:二分法
解题代码
方法一:从头到尾遍历,时间复杂度为O(n)。
方法二:二分法,找到target num的上界和下界,时间复杂度为O(logn)。
算法学习
二分法代码
class Solution {
public:
int binarySearch(int[] arr, int key){
int left = 0, right = arr.size()-1, mid=0;
while(left<=right){
mid = (left+right)/2;
if (arr[mid] == key)
return mid;
if (arr[mid] < key)
left = mid+1;
else
right = mid-1;
}
return -1;
}
int binarySearchRange(vector<int>& arr, int target, bool lower){
int left = 0, right = arr.size()-1, ret = arr.size();
while(left<=right) {
int mid = (left+right)/2;
if (arr[mid] > target || lower && arr[mid] == target ){
right = mid-1;
ret = mid;
} else {
left = mid+1;
}
}
return ret;
}
vector<int> searchRange(vector<int>& arr, int target) {
int left = binarySearchRange(arr, target, true);
int right = binarySearchRange(arr, target, false)-1;
if (left <= right)
return vector<int>{left, right};
else
return vector<int>{-1, -1};
}
};