数字在排序数组中出现的次数(Java实现)
来源:互联网 发布:浪潮软件集团有限公司 编辑:程序博客网 时间:2024/06/13 08:16
本题为剑指offer面试题38
牛客网测试地址:https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2
- 时间限制:1秒空间限制:32768K
统计一个数字在排序数组中出现的次数。
Java代码
package go.jacob.day512;public class Demo1 {/* * 方法一:用二分查找在数组中找到k所对应的下标(如果不存在返回-1),然后分别向前向后遍历,统计k出现的次数 该方法不是最优 */public int GetNumberOfK_1(int[] array, int k) {// 考虑无效输入if (array == null)return -1;int kIndex = binaryFind(array, 0, array.length - 1, k);int num = 0;// 易错点1:考虑数组中不存在要查找的数字if (kIndex != -1) {num = 1;// 易错点2:考虑下标越界for (int i = kIndex - 1; i >= 0 && array[i] == k; i--)num++;for (int i = kIndex + 1; i < array.length && array[i] == k; i++)num++;}return num;}/* * 二分查找 */private int binaryFind(int[] arr, int left, int right, int k) {if (left > right)return -1;else if (left == right)if (arr[left] == k)return left;elsereturn -1;int mid = left + (right - left) / 2;if (arr[mid] > k)return binaryFind(arr, left, mid - 1, k);else if (arr[mid] < k)return binaryFind(arr, mid + 1, right, k);elsereturn mid;}/* * 方法二:直接用二分查找找到数组中第一个k和最后一个k */public int GetNumberOfK_2(int[] array, int k) {if (array == null)return -1;int firstK = getFirstK(array, 0, array.length - 1, k);int lastK = getLastK(array, 0, array.length - 1, k);if(firstK==-1)return 0;return lastK - firstK+1;}/* * 查找第一个k的下标 */private int getFirstK(int[] arr, int left, int right, int k) {//递归终止条件if (left > right)return -1;else if (left == right)if (arr[left] == k)return left;elsereturn -1;int mid = left + (right - left) / 2;if (arr[mid] > k)return getFirstK(arr, left, mid - 1, k);else if (arr[mid] < k)return getFirstK(arr, mid + 1, right, k);//arr[mid] == kelse {//如果mid==left,即mid为第一个k的下标if (mid == left)return mid;//否则,继续递归else {if (arr[mid - 1] != k)return mid;elsereturn getFirstK(arr, left, mid - 1, k);}}}/* * 查找最后一个k的下标 */private int getLastK(int[] arr, int left, int right, int k) {if (left > right)return -1;else if (left == right)if (arr[left] == k)return left;elsereturn -1;int mid = left + (right - left) / 2;if (arr[mid] > k)return getLastK(arr, left, mid - 1, k);else if (arr[mid] < k)return getLastK(arr, mid + 1, right, k);else {if (mid == right)return mid;else {if (arr[mid + 1] != k)return mid;elsereturn getLastK(arr, mid + 1, right, k);}}}}
0 0
- 数字在排序数组中出现的次数java实现
- 数字在排序数组中出现的次数java实现
- 数字在排序数组中出现的次数(Java实现)
- 数字在排序数组中出现的次数 java
- 数字在排序数组中出现的次数 java
- 数字在排序数组中出现的次数(数组)
- 剑指offer----数字在排序数组中出现的次数----java实现
- 剑指Offer面试题38:数字在排序数组中出现的次数 Java实现
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 牛客:剑指offer:数字在排序数组中出现的次数 (Java)
- 数字在排序数组中出现的次数(java版)
- 【数组8】数字在排序数组中出现的次数
- 【数组4】数字在排序数组中出现的次数
- 数组9:数字在排序数组中出现的次数
- 数据结构与算法分析笔记与总结(java实现)--数组9:数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- 在排序数组中,找出给定数字的出现次数
- JAVAWEB开发之Maven的入门详解——Maven的安装以及项目的结构和Maven的使用以及私服的搭建与配置
- STM8S_006_AWU自动唤醒
- for嵌套循环练习
- mysql tomcat连接问题-找不到类
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- 数字在排序数组中出现的次数(Java实现)
- 【php基础班】第5天 div+CSS好处、web标准、CSS基本语法、CSS单位与字体、CSS组合选择器、CSS新闻媒体案例
- 做题时的一些零散知识点
- 数据结构之线性表——就近匹配(栈的应用)
- 【MongoDB学习笔记32】MongoDB修改副本集配置
- [leetcode: Python]226. Invert Binary Tree
- 使用变长数组,改变数组长度
- java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact
- c++类的继承:私有继承,公有继承,保护继承