剑指offer 53:数字在升序数组中出现的次数

导读:本篇文章讲解 剑指offer 53:数字在升序数组中出现的次数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

剑指offer 53

题目:
在这里插入图片描述

思路:

数组升序——-二分法
LeetCode 34:在排序数组中查找元素的第一个和最后一个位置相似,
都用了两个变形的二分法找到数组中目标元素出现的左边界索引和右边界索引,
数字k出现的次数即为: 右边界的索引-左边界的索引+1

Java实现:

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
       if(array.length==0){
           return 0;
       }
         // 升序 ---二分!
        int left=findLeft(array,k);
        int right=findRight(array,k);
        if(left==-1 && right==-1){
            return 0;  // 数组中不存在k值
        }
        return right-left+1;
        
    }
    
    int findLeft(int[] array,int k){ // 寻找左边界
        int left=0;
        int right=array.length-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(array[mid]<k){
                left=mid+1;
            }else if(array[mid]>k){
                right=mid-1;
            }else if(array[mid]==k && (mid==0 || array[mid-1]<k)){ //左边界
                return mid;
            }else{ // nums[mid]=k但不是左边界,向左继续寻找左边界
                right=mid-1;
            }
        }
        return -1; // 数组中不存在k值
    }
    
    int findRight(int[] array,int k){ // 寻找右边界
        int left=0;
        int right=array.length-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(array[mid]<k){
                left=mid+1;
            }else if(array[mid]>k){
                right=mid-1;
            }else if(array[mid]==k && (mid==array.length-1 || array[mid+1]>k)){ //右边界
                return mid;
            }else{ // nums[mid]=k 但不是右边界,向右继续寻找右边界
                left=mid+1;
            }
        }
        return -1; // 数组中不存在k值
    }
    
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89298.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!