zoukankan      html  css  js  c++  java
  • 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);
    	}
    
    }
    

      

  • 相关阅读:
    js点击按钮为元素随机字体颜色和背景色
    js随即数字random实现div点击更换背景色
    while循环计算1-100和,1-100内偶数/奇数/被整除的数的和
    慕课手机展示页案例
    第3题:求子数组的最大和
    第4题:在二叉树中找出和为某一值的所有路径
    第5题:查找最小的K个元素
    Linux系统开启IPv6任播(anycast)地址
    第7题:判断两个链表是否相交
    第8题上:思维题
  • 原文地址:https://www.cnblogs.com/kexiblog/p/11174773.html
Copyright © 2011-2022 走看看