数字在排序数组中出现的次数/leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

1.二分查找的扩展,牛客网Ac,数字在排序数组中出现的次数

c++ code:

class Solution {
public:/*二分查找的扩展,确定最左边和最右边即可*/
	int FindLeft(vector<int> data, int k)
	{
		int flag = 0;
		int begin = 0, end = data.size() - 1;
		while (begin <= end)
		{
			int mid = (begin + end) / 2;
			if (data[mid] < k)
				begin = mid + 1;
			else if (data[mid]>k)
				end = mid - 1;
			else
			{
				flag = 1;//标记数组中存在k
				if (mid>0&&data[mid - 1] == k)
					end = mid - 1;//继续向左边逼近
				else
					return mid;
			}
		}
		if (flag)
			return begin;
		else
			return -1;
	}
	int FindRight(vector<int> data, int k)
	{
		int begin = 0, end = data.size() - 1;
		int flag = 0;
		while (begin <= end)
		{
			int mid = (begin + end) / 2;
			if (data[mid] < k)
				begin = mid + 1;
			else if (data[mid]>k)
				end = mid - 1;
			else
			{
				flag = 1;
				if ((mid < data.size()-1)&&data[mid + 1] == k)
					begin = mid + 1;
				else
					return mid;
			}
		}
		if (flag)
			return end;
		else
			return -1;
	}
	int GetNumberOfK(vector<int> data, int k) {
		int left = FindLeft(data,k);
		int right =FindRight(data,k) ;
		if (left == -1 && right == -1)return 0;
		return right - left + 1;
	}
};
34. 在排序数组中查找元素的第一个和最后一个位置

本题就是二分查找的变形,我记得和之前的一个剑指offer题在排序数组中查找元素的出现的次数其实一样。https://blog.csdn.net/dongyanwen6036/article/details/84863703
如果没查找到,返回-1.
97% AC leetcode C++:

class Solution {
public:
	int FindLeft(vector<int>& nums, int target)
	{
		int low = 0, high = nums.size() - 1;		 
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (nums[mid] > target)
				high = mid - 1;
			else if (nums[mid] < target)
				low = mid + 1;
			else
			{
				 
				if (mid > 0 && nums[mid - 1] == target)
					high = mid - 1;
				else
					return mid;
			}
		}
		return  -1; 
	}
	int FindRight(vector<int>& nums, int target)
	{
		int low = 0, high = nums.size() - 1;
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (nums[mid] > target)
				high = mid - 1;
			else if (nums[mid] < target)
				low = mid + 1;
			else
			{

				if (mid < nums.size()-1 && nums[mid + 1] == target)
				     low = mid + 1;
				else
					return mid;
			}
		}
		return  -1;
	}
	vector<int> searchRange(vector<int>& nums, int target) {
		int Left = FindLeft(nums,target);
		int Right = FindRight(nums,target);
		vector<int> res;
		res.push_back(Left);
		res.push_back(Right);
		return res;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值