数字在排序数组中出现的次数

题目描述:

统计一个数字在排序数组中出现的次数。

思路:

最基本的思路就是根据排序数组的特点进行二分法定位,定位会出出现的情况时,K可能是第一个,可能是中间某一位置,也可能在最后一个,所以定位到K后,再往左边遍历直到不为K为止,再从定位位置往右遍历直到不为K为止,这样就能计算出K的总数,除此之外,还有加强版的二分法直接定位到K的边界位置,即第一个或者最后一个K的位置,这样就能直接往一个方向遍历计数K的个数,当找第一个K位置时,当定位到K位置d时,还要确保d-1位置不为K或者小于K或者找最后一个K位置时,当找到K位置d时,还要确保d+1位置不为K。

代码:

/*找到K*/
class solution
{
	public:
		int GetK(int[] data, int k, int start, int end)
		{
			int index=0;
			int FirstKnum=0;
			int mid=(start+end)/2;
			while((end-start)>=0)
			{
				if(data[mid]>k)
				{
					end=mid;
					start=start;
				}
				else if(data[mid]<k)
				{
					start=mid;
					end=end;
				}
				else
				{
					index=mid;
					break;
				}
				//else if(data[mid]==k&&)
				mid=(start+end)/2;
			}
			int num0=index;
			int num1=index;
			while(data[num0]==k)
			{
				num0++;
				FirstKnum++;			
			}
			while(data[num1]==k)
			{
				num1--;
				FirstKnum++;
			}
			

			return FirstKnum;
		}
}

 

/*找到第一个k*/
class solution
{
	public:
		int GetFirstK(int[] data, int k, int start, int end)
		{
			int index=0;
			int FirstKnum=0;
			int mid=(start+end)/2;
			while((end-start)>=0)
			{
				if(data[mid]==k&&data[mid-1]!=k)
				{
					index=mid;
					break;
				}
				else if(data[mid]==k&&data[mid-1]==k)
				{
					start=start;
					end=mid-1;
				}
				else if(data[mid]>k)
				{
					start=start;
					end=mid-1;
				}
				else
				{
					start=mid+1;
					end=end;
				}
				mid=(start+end)/2;
			}
			while(data[index++]==k)
			{
				FirstKnum++;
			}
			return FirstKnum;
			
		}
}
/*找到最后k位置*/
class solution
{
	public:
		int GetLastK(int[] data, int k, int start, int end)
		{
			int index=0;
			int FirstKnum=0;
			int mid=(start+end)/2;
			while((end-start)>=0)
			{
				if(data[mid]==k&&data[mid+1]!=k)
				{
					index=mid;
					break;
				}
				else if(data[mid]==k&&data[mid+1]==k)
				{
					start=mid+1;
					end=end;
				}
				else if(data[mid]>k)
				{
					start=start;
					end=mid-1;
				}
				else
				{
					start=mid+1;
					end=end;
				}
			}
			while(data[index--]==k)
			{
				FirstKnum++;
			}
			return FirstKnum;
		}
		
		
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值