剑指offer(39):数字在排序数组中出现的次数
来源:互联网 发布:2017网络虚假新闻案例 编辑:程序博客网 时间:2024/06/09 14:35
题目描述
统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于数字3在排序数组中出现了4次,则输出4。
分析
直接思路:顺序扫描直接统计3出现的次数,时间复杂度为
推荐思路:参考二分查找的思路,可以实现时间复杂度为times = lastIndex - firstIndex + 1
。
第一个k的查找:二分查找中,先找到k,如果k**前面**的数字不为k,则该处的k就是第一个k;如果k前面的数字等于k,则在该处的k前面部分继续寻找。
第二个k的查找:二分查找中,先找到k,如果k**后面**的数字不为k,则该处的k就是最后一个k;如果k后面的数字等于k,则在该处的k后面部分继续寻找。
牛客AC:
package com.problem;/** * 统计一个数字在排序数组中出现的次数。 * 例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3, * 由于数字3在排序数组中出现了4次,则输出4。 * @author Administrator * */public class TimesOfNumber { public static void main(String[] args) { int[] arr = {1,2,3,3,3,3,4,5}; TimesOfNumber timesOfNumber = new TimesOfNumber(); System.out.println(timesOfNumber.GetNumberOfK(arr, 3)); } public int GetNumberOfK(int[] arr , int k) { if(arr == null || arr.length <= 0) return 0; // 二分查找获取第1个k和最后1个k的索引 int firstIndex = getFirstIndexOfK(arr, k, 0, arr.length - 1); int lastIndex = getLastIndexOfK(arr, k, 0, arr.length - 1); // 计算k出现次数 int times = 0; if(firstIndex > -1 && lastIndex > -1) times = lastIndex - firstIndex + 1; return times; } // 获取第1个k的索引,没有返回-1 public int getFirstIndexOfK(int[] arr, int k, int start, int end) { if(start > end) return -1; while(start <= end) { int mid = (start + end) / 2; if(arr[mid] == k) { // mid大于0,并且mid前面的数不等于k;或者mid等于0时,找到了第1个k if((mid > 0 && arr[mid - 1] != k) || mid == 0) { return mid; } else { end = mid - 1; } } else if(arr[mid] > k) { end = mid - 1; } else { start = mid + 1; } } return -1; } // 获取最后1个k的索引,没有返回-1 public int getLastIndexOfK(int[] arr, int k, int start, int end) { if(start > end) return -1; while(start <= end) { int mid = (start + end) / 2; if(arr[mid] == k) { // mid小于end,并且mid后面的数不等于k;或者mid等于end时,找到了最后一个k if((mid < end && arr[mid + 1] != k) || mid == end) { return mid; } else { start = mid + 1; } } else if(arr[mid] > k) { end = mid - 1; } else { start = mid + 1; } } return -1; }}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社
0 0
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer--数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer|数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 《剑指offer》-数字在排序数组中出现的次数
- 剑指offer - 数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 改变Activity启动时的默认动画
- 在C++中将一个GUID变量转换成为string变量
- android---高德地图(5)导航界面(语音播报)实现
- android---高德地图(4)路线规划
- mysql 空间计算
- 剑指offer(39):数字在排序数组中出现的次数
- [转]JAVA String 类
- Android Glide图片加载框架图片变色变绿解决方法
- android---高德地图(3)点击获得目的经纬度,地理编码
- Codeforces Beta Round #19D. Points
- tez跑任务报错
- 详解css中relative,absolute,float用法
- 全文索引----solr客户端工具solrJ
- android---高德地图(2)---定位-显示小蓝点