数字在排序数组中出现的次数(剑指offer第38题)

一、题目描述

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

二、解题思路

方法一、暴力法,遍历一遍数组,记录下k出现的次数,时间复杂度为O(n)

方法二、二分查找法,递归或循环。时间复杂度O(logn)

三、java代码

public class Solution_38 {
	 
	/*统计一个数字在排序数组中出现的次数。
	 */
	//方法一、暴力解法,一个一个遍历再比较,时间复杂度是O(N) 
	  public int GetNumberOfK(int [] array , int k) { //19ms 9300k
	       if(array == null)
	    	   return 0;
	       int count = 0;
	       for(int i = 0;i<array.length;i++){
	    	   if(array[i]== k ){
	    		   count ++;
	    	   }
	       }
	       return count;
	    }
	  
	  
	  //方法二、二分法递归求解,时间复杂度O(logN),求出第一次出现的位置和最后一次出现的位置,再求差即可
	 public int GetNumberOfK_2(int [] array,int k){ //19ms 9424k
		 int length = array.length;
		 if(array == null || length == 0){
			 return 0;
		 }
		 int firstK = getFirstK(array, k, 0, length-1);
		 int lastK = getLastK(array, k, 0, length-1);
		 if(firstK!=-1&&lastK!=-1){
			 return lastK-firstK+1;
		 }
		 return 0;
	  }
	  //二分法递归获取第一次出现的k的位置
	  public int getFirstK(int []array,int k,int start,int end){
		  if(start>end){
			  return -1;
		  }
		  int mid = (start+end) >> 1;  //求出中间位置
		  if(array[mid] > k){
			  return getFirstK(array, k, start, mid-1);
		  }else if(array[mid] < k){
			return getFirstK(array, k, mid+1, end);
	   	  }else if (mid -1 >= 0 && array[mid-1] == k) {
			return getFirstK(array, k, start, mid-1);
		  }else {
			return mid;
		  }
	  }
	  //循环获取最后一次k出现的位置
	  public int getLastK(int []array,int k,int start,int end){
		  int length = array.length;
		  int mid = (start+end) >> 1;
		  while(start <= end){
			  if(array[mid]>k){
				  end = mid - 1;
			  }else if(array[mid]<k){
				  start = mid + 1;
			  }else if(mid+1<length && array[mid+1] == k){
				  start = mid + 1;
			  }else {
				return mid;
			  }
			  mid = (start+end) >> 1;
		  }
		  
		  return -1;
	  }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值