在排序数组中查找元素的第一个和最后一个位置

≯℡__Kan透↙ 提交于 2020-01-15 08:57:21

题目

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。

如果数组中不存在目标值,返回 [-1, -1]

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

代码与思路

#include <stdio.h>

#include <vector>

//查找左端点
int left_bound(std::vector<int>& nums, int target){
	int begin = 0;
	int end = nums.size() - 1;
	while(begin <= end){
		int mid = (begin + end) / 2;
		if (target == nums[mid]){
			if (mid == 0 || nums[mid -1] < target){
				return mid;
			}
			end = mid - 1;
		}
		else if (target < nums[mid]){
			end = mid - 1;
		}
		else if (target > nums[mid]){
			begin = mid + 1;
		}
	}
	return -1;
}

//查找右端点
int right_bound(std::vector<int>& nums, int target){
	int begin = 0;
	int end = nums.size() - 1;
	while(begin <= end){
		int mid = (begin + end) / 2;
		if (target == nums[mid]){
			if (mid == nums.size() - 1 || nums[mid + 1] > target){
				return mid;
			}
			begin = mid + 1;
		}
		else if (target < nums[mid]){
			end = mid - 1;
		}
		else if (target > nums[mid]){
			begin = mid + 1;
		}
	}
	return -1;
}

class Solution {
public:
    std::vector<int> searchRange(std::vector<int>& nums, int target) {
        std::vector<int> result;
        result.push_back(left_bound(nums, target));
        result.push_back(right_bound(nums, target));
        return result;
    }
};

int main(){
	int test[] = {5, 7, 7, 8, 8, 8, 8, 10};
	std::vector<int> nums;
	Solution solve;
	for (int i = 0; i < 8; i++){
		nums.push_back(test[i]);
	}
	for (int i = 0; i < 12; i++){
		std::vector<int> result = solve.searchRange(nums, i);
		printf("%d : [%d, %d]\n",i , result[0], result[1]);
	}
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!