算法(48)--数字在升序数组中出现的次数
前言
仅记录学习笔记,如有错误欢迎指正。
题目
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数要求:空间复杂度 O(1),时间复杂度 O(logn)
示例:
-
输入:[1,2,3,3,3,3,4,5],3 输出: 4
解法
有序要想到二分查找!2022加油~public class Solution { public int GetNumberOfK(int [] array , int k) { //看见有序,肯定就是二分查找了 int len = array.length; if(len == 0){ return 0; } int firstNum = getFirst(array,k,0,len-1); int lastNum = getLast(array,k,0,len-1); if(firstNum != -1 && lastNum != -1){ return lastNum - firstNum + 1; } return 0; } //递归写法 public int getFirst (int[] array,int k,int start,int end){ if(start > end){ return -1; } int mid = (start + end) >> 1;//除以2的n次方 if(k < array[mid]){ return getFirst(array,k,start,mid-1); }else if(k > array[mid]){ return getFirst(array,k,mid+1,end); //可能存在重复的 找到左边的第一个 }else if(mid-1 >= 0 && array[mid-1] == k){ return getFirst(array, k, start, mid-1); }else{ return mid; } } //循环写法 public int getLast (int[] array,int k,int start,int end){ int length = array.length; int mid = (start + end) >> 1; while(start <= end){ if(array[mid] > k){ end = mid-1; }else if(array[mid] < k){ start = mid+1; //可能存在重复的 找到右边的最后一个 }else if(mid+1 < length && array[mid+1] == k){ start = mid+1; }else{ return mid; } //重置mid的值 mid = (start + end) >> 1; } return -1; } }