【数组8】数字在排序数组中出现的次数

来源:互联网 发布:渲染软件lumion 编辑:程序博客网 时间:2024/04/26 11:11

题目描述

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

public class Solution {    public int GetNumberOfK(int [] array , int k) {       if(array==null||array.length<=0)           return 0;        int first=-1;        int last=-1;         //找到第一次出现的位置        for(int i=0;i<array.length;i++){            if(array[i]==k){            first=i;            break;         }        }        //第一遍查询没有k值直接返回0        if(first==-1)            return 0;       //找到最后一次出现的位置        for(int j=array.length-1;j>=0;j--){            if(array[j]==k){            last=j;            break;          }        }        return (last-first+1);    }}




解法一:时间复杂度O(n)

public class Solution {    public int GetNumberOfK(int [] nums , int k) {        if(nums==null ||nums.length<=0)           return 0;        int len=nums.length;        //只有一个数        if(len==1){            if(nums[0]==k)                return 1;        }        int firstK=0;        int lastK=0;        int i=0;        while(i<len){            if(nums[i]==k){                firstK=i;                break;            }            i++;        }        int j=len-1;        while(j>0){            if(nums[j]==k){                lastK=j;                break;            }            j--;        }        //不存在K        if(lastK==0 &&firstK==0){            return 0;        }        int times=lastK-firstK;        if(times>=0)            return times+1;        return 0;    }}

解法二:二分查找法,时间复杂度O(logn)

public class Solution {    public int GetNumberOfK(int [] nums , int k) {        if(nums==null||nums.length<=0)            return 0;        int len=nums.length;        int firstK=GetFirstK(nums,0,len-1,k);        int lastK=GetLastK(nums,0,len-1,k);        int times=0;        if(firstK>=0 &&lastK>=0)            times= lastK-firstK+1;        return times;    }    private int GetFirstK(int[]nums,int start,int end,int k){        if(start>end)            return -1;        int midIndex=(end+start)/2;        int midVal=nums[midIndex];        if(midVal==k){           if(((midIndex>0 &&nums[midIndex-1]!=k))||midIndex==0){               return midIndex;             }else{               end=midIndex-1;             }        }else if(midVal>k){            end=midIndex-1;        }else{            start=midIndex+1;        }        return GetFirstK(nums,start,end,k);    }    private int GetLastK(int[]nums,int start,int end,int k){        if(start>end)          return -1;        int midIndex=(end+start)/2;        int midVal=nums[midIndex];        if(midVal==k){           if(((midIndex<nums.length-1 &&nums[midIndex+1]!=k))||midIndex==nums.length-1){              return midIndex;           }else{              start=midIndex+1;           }        }else if(midVal>k){              end=midIndex-1;        }else{             start=midIndex+1;        }        return GetLastK(nums,start,end,k);    }}




0 0
原创粉丝点击