剑指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之间等于val的元素区间.返回值是一对迭代器。此函数假定first和last区间内的元素可以使用<操作符或者指定的comp执行比较操作.

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        auto resultPair = equal_range(data.begin(), data.end(),k);
        return resultPair.second - resultPair.first;
    }
};

2.二分查找(源于@披萨大叔)
P.S.我有一个疑问,题目提的是排序,没说升序还是降序……二分法不需要确定一下吗??

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int length = array.length;
        if(length == 0){
            return 0;
        }
        int firstK = getFirstK(array, k, 0, length-1);
        int lastK = getLastK(array, k, 0, length-1);
        if(firstK != -1 && lastK != -1){
             return lastK - firstK + 1;
        }
        return 0;
    }
    //递归写法
    private int getFirstK(int [] array , int k, int start, int end){
        if(start > end){
            return -1;
        }
        int mid = (start + end) >> 1;
        if(array[mid] > k){
            return getFirstK(array, k, start, mid-1);
        }else if (array[mid] < k){
            return getFirstK(array, k, mid+1, end);
        }else if(mid-1 >=0 && array[mid-1] == k){
            return getFirstK(array, k, start, mid-1);
        }else{
            return mid;
        }
    }
    //循环写法
    private int getLastK(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 = (start + end) >> 1;
        }
        return -1;
    }

原文地址:https://www.cnblogs.com/xym4869/p/12326634.html

时间: 2024-08-07 17:31:30

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

【剑指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 //

《剑指offer》:[38]数字在排序数组中出现的次数

"沟通.学习能力就是看面试者能否清晰.有条理地表达自己,是否会在自己所得到的信息不够的情况下主动发问澄清,能否在得到一些暗示之后迅速做出反应纠正错误"                                                                                                                   ---陈黎明(MSoft-SDE) 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3

[剑指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解题报告(Java版)——排序数组中某个数的个数 38

? ? 分析问题 ? ? 问题只需要找到排序数组中某个数K的个数,由于已经是排序了,K一定是在一堆的,所以我们只需要找到第一个K的index1,然后找到最后一个K的index2就可以了 ? ? 而寻找K的过程我们一般通过二分法查找,这样时间复杂度能降到logn ? ? 解决问题 ? ? 我们通过二分法寻找k,如果中间的数小于k,那么在前半段找k:如果中间的数大于k,那么在后半段找k,那么如何判断找到的k是否是一堆k的边界呢 ? ? 找第一个k的时候判断方式如下: 如果中间的数等于k,那么先判断前

剑指offer系列源码--二维数组中的查找

题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14827 解决:2888 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1

剑指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】数字在排序数组中出现的次数

转载请注明出处: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——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

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

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

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