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

题目描述

统计一个数字在排序数组中出现的次数。
package new_offer;
/**
 * 统计一个数字在排序数组中出现的次数
 * @author Sonya
 *思路:
 *1 暴力遍历 那么有序没有得到体现 复杂度在O(N);
 *2 有序 想到二分查找 利用二分查找 得出
 */
public class N37_GetNumberOfK {
	
	public int GetNumberOfK(int [] array , int k) {
		int count=0;
		for(int i=0;i<array.length;i++) {
			if(array[i]==k)count++;
		}
	     return count;
    }
	public int GetNumberOfK2(int [] array , int k) {
		if(array.length==0)return 0;
		int count=0;
		int start=getfirstk(array,array.length,k,0,array.length-1);
		int end=getlastk(array,array.length,k,0,array.length-1);
		if(start>-1&&end>-1)count=end-start+1;
	    return count;
    }
	//利用二分查找,查找到第一个k值所在位置。
	public int getfirstk(int []array,int lenght,int k,int start,int end) {
		if(start>end)return -1;
		int middleindex=(end+start)/2;
		int middledata=array[middleindex];
		if(middledata==k) {//如果中间值等于K,判断这个值是否是第一个。
			if((middleindex>0&&array[middleindex-1]!=k)||middleindex==0) {
				return middleindex;
			}
			else end=middleindex-1;
		}
		else if(middledata>k) {
				end=middleindex-1;	
			}
		else{
				start=middleindex+1;
			}
		return getfirstk(array,array.length,k,start,end);
		
	}
	//利用二分查找,查找到最后一个k值所在位置。
	public int getlastk(int []array,int length,int k,int start,int end) {
		if(start>end)return -1;
		int middleindex=(end+start)/2;
		int middledata=array[middleindex];
		if(middledata==k) {
			if((middleindex<end&&array[middleindex+1]!=k)||middleindex==end) {
				return middleindex;
			}
			else {start=middleindex+1;}
		}else if(middledata>k) {
			end=middleindex-1;
		}else {
			start=middleindex+1;
		}	
		return getlastk(array,length,k,start,end);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int []array= {1,2,3,3,3,4,5,6,6,6,9};
		N37_GetNumberOfK n37=new N37_GetNumberOfK();
		int count=n37.GetNumberOfK(array, 3);
		int count2=n37.GetNumberOfK2(array, 3);
		System.out.println(count);
		System.out.println(count2);
	}

}

  

posted @ 2019-07-12 10:53  柯汐  阅读(175)  评论(0编辑  收藏  举报