zoukankan      html  css  js  c++  java
  • 剑指offer系列41---数字在数组中出现的次数

    【题目】统计一个数字在排序数组中出现的次数。

     1 package com.exe9.offer;
     2 
     3 /**
     4  * 【题目】统计一个数字在排序数组中出现的次数。
     5  * @author WGS
     6  *
     7  */
     8 public class GetNumOfK {
     9     public int getNumOfK(int[] arr,int target){
    10         if(arr==null || arr.length<=0) return -1;
    11         int len=arr.length;
    12         int count=0;
    13         
    14         
    15         int lastIndex=findLastK(arr, target, 0, len-1);
    16         System.out.println("==="+lastIndex);
    17         if(lastIndex==-1)
    18             return -1;
    19         int firstIndex=findFirstK(arr, target, 0, len-1);
    20         System.out.println("==="+firstIndex);
    21         
    22         if(firstIndex>=0 && lastIndex>=0)
    23             count=lastIndex-firstIndex+1;
    24         
    25         return count;
    26         
    27     }
    28     
    29     //先寻找重复数字出现在最左边的位置
    30     public int findFirstK(int[] arr,int target,int start,int end){    
    31         if(start>end) return -1;
    32         
    33         int midIndex=(start+end)/2;
    34         int midVal=arr[midIndex];
    35         
    36         if(midVal==target){
    37             while(midVal==target){
    38                 midIndex--;
    39                 midVal=arr[midIndex];
    40             }
    41             return midIndex+1;            
    42         }else if(midVal<target){
    43             start=midIndex+1;
    44         }else{//midVal>target
    45             end=midIndex-1;
    46         }
    47         
    48         return findFirstK(arr,target,start,end);
    49         
    50     }
    51     ////先寻找重复数字出现在最右边的位置
    52     public int findLastK(int[] arr,int target,int start,int end){
    53         if(start>end) return -1;
    54         int midIndex=(start+end)/2;
    55         int midVal=arr[midIndex];
    56         
    57         if(midVal==target){
    58             while(midVal==target){
    59                 midIndex++;    
    60                 midVal=arr[midIndex];
    61             }
    62             return midIndex-1;            
    63         }else if(midVal<target){
    64             start=midIndex+1;
    65         }else{//midVal>target
    66             end=midIndex-1;
    67         }
    68         
    69         return findFirstK(arr,target,start,end);    
    70         
    71     }
    72 
    73     public static void main(String[] args) {
    74         int[] arr=new int[]{1};
    75         GetNumOfK g=new GetNumOfK();
    76         int num=g.getNumOfK(arr, 3);
    77         System.out.println(num);
    78 
    79     }
    80 
    81 }
  • 相关阅读:
    WCF在tcp通道下启用httpget
    mounted里面this.$refs.xxx的内容是undefined
    小程序和vue的区别
    多维数组扁平化处理
    浏览器事件循环机制(event loop)
    前端优化总结
    vue子组件通知父组件使用方法
    axios拦截器使用方法
    vue-router配置
    斐波那契数列及青蛙跳台阶问题
  • 原文地址:https://www.cnblogs.com/noaman/p/5601792.html
Copyright © 2011-2022 走看看