剑指offer-test37

37.数字在排序数组中出现的次数。(这是一个排序数组可以使用二分查找方法)

import java.util.Arrays;
public class Solution {
    public  int GetNumberOfK(int [] array , int k) {
        Arrays.sort(array);//排序数组
        int res=0;
        int mid=0;
        int low=0,high=array.length-1;
        while(low<=high){
            mid=(low+high)/2;
            if(k==array[mid]){
                res++;//先将结果值+1
                break;
            }
            else if(k<array[mid])//说明k值在数组的左半部分
                high=mid-1;
            else 
                low=mid+1;
        }
        //因为有可能有重复的值,所以需要以下代码
        for(int i=mid+1;i<array.length;i++){// 以 mid+1为起始向后查找
            if(array[i]==k){
                res++;
            }
            else{// 如果不相等了结束循环(数组已经排序了,后面不可能有再相等的了)
                break;
            }
        }
        for(int j=mid-1;j>=0;j--){//以mid—1为起始向前查找
            if(array[j]==k){
                res++;
            }
            else{
            }
        }
        return res;
    }
}

方法2:用二分查找方法定位k的第一次出现位置和最后一次出现位置

import java.util.Arrays;
public class Solution {
    public  int GetNumberOfK(int [] array , int k) {
        Arrays.sort(array);//排序数组
        int minindex=array.length;
        int maxindex=array.length;
        int mid=0;
        int begin=0,end=array.length-1;
        // 二分查找第一个等于 k 的位置。
        while(begin<=end){
            mid=(begin+end)/2;
            if(k==array[mid]){
                minindex=mid;//先将结果值+1
                end=mid-1;
            }
            else if(k<array[mid])//说明k值在数组的左半部分
                end=mid-1;
            else 
                begin=mid+1;
        }
         // 如果没找到 k ,则返回 0。
        if(minindex==array.length) return 0;
        begin=0;
        end=array.length-1;
        // 二分查找第一个比k大的位置
            while(begin<=end){
            mid=(begin+end)/2;
            if(array[mid]<=k){
                begin=mid+1;
            }
            else{
                maxindex=mid;
                end=mid-1;
            }
        }
        return maxindex-minindex;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值