剑指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);
        return exit(data,k) ? (index2-index1+1) : 0;
    }
    int GetFirst(vector<int> data,int k,int start,int end){
        if(start == end)
            return start;
        int first = 0;
        int mid = (start+end)/2;
        if(data[mid] == k){
            if(data[mid-1] != k)
                return mid;
            else
                first = GetFirst(data,k,start,mid-1);
        }
        else if(data[mid] < k)
            first = GetFirst(data,k,mid+1,end);
        else
            first = GetFirst(data,k,start,mid-1);
        return first;
    }
    int GetLast(vector<int> data,int k,int start,int end){
        if(start == end)
            return start;
        int last = end;
        int mid = (start+end)/2;
        if(data[mid] == k){
            if(data[mid+1] != k)
                return mid;
            else
                last = GetLast(data,k,mid+1,end);
        }
        else if(data[mid] < k)
            last = GetLast(data,k,mid+1,end);
        else
            last = GetLast(data,k,start,mid-1);
        return last;
    }
    bool exit(vector<int> data,int k){
        int length = data.size();
        int i = 0;
        for(;i < length;i++){
            if(data[i] == k)
                return true;
        }
        return false;
    }
};

更简洁的代码

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        if(data.empty() || k <= 0)
            return 0;
        int FirstK = GetFirstK(data,k,0,data.size()-1);
        int LastK = GetLastK(data,k,0,data.size()-1);
        if(FirstK > -1 && LastK > -1)
            return LastK - FirstK + 1;
        else
            return 0;
    }
    int GetFirstK(vector<int> data,int k,int start,int end){
        if(start > end)
            return -1;
        int mid = (end + start)/2;
        if(data[mid] == k){
            if(data[mid-1] == k)
                end = mid - 1;
            else
                return mid;
        }
        else if(data[mid] > k)
            end = mid - 1;
        else if(data[mid] < k)
            start = mid + 1;
        return GetFirstK(data,k,start,end);
    }
    int GetLastK(vector<int> data,int k,int start,int end){
        if(start > end)
            return -1;
        int mid = (end + start)/2;
        if(data[mid] == k){
            if(data[mid+1] == k)
                start = mid + 1;
            else
                return mid;
        }
        else if(data[mid] > k)
            end = mid - 1;
        else if(data[mid] < k)
            start = mid + 1;
        return GetLastK(data,k,start,end);

    }
};
时间: 2024-10-12 21:26:28

剑指offer 38 数字在排序数组中出现的次数的相关文章

【剑指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] 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 面试题38—数字在排序数组中出现的次数

题目: 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 解法一:O(n) 顺序遍历 解法二:O(logn) 用二分查找,分别找出第一个3,和最后一个3的位置,然后计算个数. #include <stdio.h> int GetFirstK(int* data,int length,int k,int start,int end) { if(start > end) return -1; int m

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

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

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

思路: 应该是用二分查找分别找到该数字第一次和最后一次出现的位置,相减即可.O(logn) int findLeft(int a[], int n, int num) { int l = 0, r = n - 1; while(l <= r) { int m = l + (r - l) / 2; if(a[m] == num) //与普通二分查找的区别在等于这里 { if(m == 0 || a[m - 1] != num) //如果这是第一个数字或者它前面的数字不是num那么这个位置就是第一个

38.数字在排序数组中出现的次数

半段查找. int GetFirstK(int* data, int length, int k, int start, int end) { if (start > end) return -1; int middleIndex = (start + end) / 2; int middleData = data[middleIndex]; if (middleData == k) { if ((middleIndex > 0 && data[middleIndex - 1]

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

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