【剑指Offer】37:数字在排序数组中出现的次数

题目描述

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

题解一:循环
 1 public static int GetNumberOfK(int [] array , int k) {
 2         if(array.length==0){
 3             return 0;
 4         }
 5         int count=0;
 6         for(int i=0;i<array.length;i++){
 7             if(array[i]==k){
 8                 count++;
 9             }
10         }
11         return count;
12     }
题解二:二分法
 1 //因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5
 2 //这两个数应该插入的位置,然后相减即可。
 3 public static int GetNumberOfK01(int [] array , int k) {
 4         if(array == null || array.length == 0) {
 5             return 0;
 6         }
 7         return biSearch(array, k + 0.5) - biSearch(array, k - 0.5);
 8     }
 9     private static int biSearch(int [] array, double k){
10         int low = 0, high = array.length - 1;
11         while(low <= high){
12             int mid = low + (high -low) / 2;
13             if(array[mid] > k) {
14                 high = mid - 1;
15             } else{
16                 low = mid + 1;
17             }
18         }
19         return low;
20     }

测试:

1 public static void main(String[] args) {
2         int[] array={3,3,3,3,4,5};
3         int k=3;
4         int numberOfK= GetNumberOfK01(array, k);
5         System.out.println(numberOfK);
6     }
7 输出:4

原文地址:https://www.cnblogs.com/Blog-cpc/p/12443249.html

时间: 2024-10-29 02:28:08

【剑指Offer】37:数字在排序数组中出现的次数的相关文章

[剑指Offer] 37.数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. 1 class Solution { 2 public: 3 int getIndexbyDivision(vector<int> data,int k){ 4 int left = 0,right = data.size() - 1; 5 int middle = left + (right - left)/2; 6 while(le

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,

剑指offer:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 思路分析: 1. 直观思路是直接遍历一遍,统计.复杂度也只要O(n). 2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成.分别二分查找第一个k和最后一个k.具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回:否则即第一个k在前面,则右边界r左移,继续递归查找.对于最后一个k的查找思路类似. 代码: 思路二: 1 class Solution { 2 public: 3 int GetF

剑指offer 38 数字在排序数组中出现的次数

自己的写法 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { int length = data.size(); if(length <= 0) return 0; for(int i = 0;i < length;i++){ } int index1 = GetFirst(data,k,0,length-1); int index2 = GetLast(data,k,0,length-1);

剑指offer系列——37.数字在排序数组中出现的次数

Q:统计一个数字在排序数组中出现的次数. A: 1.用STL库函数解决 (1)count函数:algorithm头文件定义,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. public: int GetNumberOfK(vector<int> data ,int k) { return count(data.begin(),data.end(),k); } 或 (2)equal_range函数:函数equal_range()返回first和last

剑指offer系列41---数字在数组中出现的次数

[题目]统计一个数字在排序数组中出现的次数. 1 package com.exe9.offer; 2 3 /** 4 * [题目]统计一个数字在排序数组中出现的次数. 5 * @author WGS 6 * 7 */ 8 public class GetNumOfK { 9 public int getNumOfK(int[] arr,int target){ 10 if(arr==null || arr.length<=0) return -1; 11 int len=arr.length;

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3

剑指Offer——数字在排序数组中出现的次数

1.题目描述 统计一个数字在排序数组中出现的次数. 2.代码实现 package com.baozi.offer; /** * 统计一个数字在排序数组中出现的次数. * * @author BaoZi * @create 2019-07-14-8:52 */ public class Offer26 { public static void main(String[] args) { Offer26 offer26 = new Offer26(); int[] array = new int[]

数字在排序数组中出现的次数(剑指offer)利用快排思想(O(logn))

数字在排序数组中出现的次数 参与人数:1216时间限制:1秒空间限制:32768K 通过比例:28.43% 最佳记录:0 ms|0K(来自 ) 题目描述 统计一个数字在排序数组中出现的次数. 题意:首先数组是个已经排列的有序递增序列!统计一个数出现的次数,相当于在有序的序列里插入一个数,那么我只要确定插入的位置,利用快排的思想,也可以说是二分,如果在数组中找到k,那么左右拓展边界就可以确定,该数在数组中出现的次数了. 一些特殊情况可以特判!比如k小于数组最小数,或者大于数组最大数: class