剑指offer----数字在排序数组中出现的次数----java实现
来源:互联网 发布:中央人民大学网络教育 编辑:程序博客网 时间:2024/06/05 20:10
题目:统计一个数字在排序数组中出现的次数。
因为是排序数组,那么数组中第一个K之前的数都会比K小,最后一个K之后的数都会比K大,可以分为两步来解决这个问题,分别用二分查找找到数组中第一个K再找到第二个K,这样就可以得到数组中K的个数。
在数组中查找K,如果中间的数比K大,那么K出现在前半段;
如果比K小,K出现在后半段,那么K出现在后半段;
如果等于K,寻找第一个K的算法则需要判断K的前一个数和K的大小或者是否已经到达数组的起始位置:
1)等于K的话,则第一个K还在半段,
2)如果不等于K,则K是第一个K;
寻找最后一个K的算法,则需要和K后面的一个数进行比较,或者是否已经到达数组的终止位置
1)等于K的话,则最后一个K还在后半段
2)不等于K的话,则这个K就是最后一个K
代码:
public class Solution { public int GetNumberOfK(int [] array , int k) { int number = 0;if(array !=null){ int first = getFirstK(array,k,0,array.length-1);//调用方法得到第一个k的位置 int last = getLastK(array,k,0,array.length -1);//调用方法得到最后一个k的位置 if(first > -1 && last > -1){number = last - first + 1;//得到k的个数}}return number; } private int getFirstK(int[]array,int k,int start,int end) { if(start > end) { return -1; } int midIndex = (start + end) / 2; //二分查找的中间位置 int midData = array[midIndex] ; //当中间位置等于K时 if(midData == k) { //判断中间位置的前一个数是不是等于K,不等于k则是第一个k,还需要判断此时有没有到达了数组的起始位置 if((midIndex > 0 && array[midIndex-1]!=k)|| midIndex == 0) { return midIndex; } else { end = midIndex - 1;//如果要是等于k的话,则第一个k还在前半段 } } else if(midData > k) //中间的数如果大于k,则k在前半段, { end = midIndex -1; } else //中间的数小于k,则k在后半段 { start = midIndex + 1; } return getFirstK(array,k,start,end); } private int getLastK(int[]array,int k,int start,int end) { if(start > end) return -1; int midIndex = (start + end) / 2; int midData = array[midIndex]; if(midData == k) { if((midIndex < array.length - 1 && array[midIndex + 1] != k) || midIndex == array.length -1) { return midIndex; } else { start = midIndex + 1; } } else if(midData > k) { end = midIndex - 1; } else { start = midIndex + 1; } return getLastK(array,k,start,end); }}
0 0
- 剑指offer----数字在排序数组中出现的次数----java实现
- 剑指Offer面试题38:数字在排序数组中出现的次数 Java实现
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer--数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer|数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 《剑指offer》-数字在排序数组中出现的次数
- 剑指offer - 数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- ffmpeg下载及安装
- Java与JSTL变量交互
- “深入理解”—选择排序算法
- LeetCode - 242. Valid Anagram
- iOS性能优化-TableView
- 剑指offer----数字在排序数组中出现的次数----java实现
- 最短前缀
- HTML标签以及各个标签属性大全
- C++11中的进行线程同步的方法
- 为什么要重写toString()方法
- 初涉MySQL操作(一)
- matlab移位运算
- 快速幂(普通快速幂、矩阵快速幂)
- c# java 比较