zoukankan      html  css  js  c++  java
  • 剑指Offer-36.数字在排序数组中出现的次数(C++/Java)

    题目:

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

    分析:

    给定一个已经排好序的数组,统计一个数字在数组中出现的次数。

    那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这个性质来缩减时间复杂度的。

    因为如果所给的数字在数组中出现,那么这个数字在数组中一定是连续的,那么可以利用二分查找所给出的数字的首尾索引。

    程序:

    C++

    class Solution {
    public:
        int GetNumberOfK(vector<int> data ,int k) {
            if(data.size() == 0){
                return 0;
            }
            int l = FindFirst(data, k, 0, data.size()-1);
            int r = FindEnd(data, k, 0, data.size()-1);
            if(r != -1 && l != -1)
                return r-l+1;
            else
                return 0;
        }
        int FindFirst(vector<int> &data ,int k, int left, int right){
            if(left > right)
                return -1;
            int mid = left + (right - left) / 2;
            if(data[mid] == k){
                if((mid > 0 && data[mid-1] != k) || mid == 0)
                    return mid;
                else
                    right = mid - 1;
            }
            else if(data[mid] < k){
                left = mid + 1;
            }
            else{
                right = mid -1;
            }
            return FindFirst(data, k, left, right);
        }
        int FindEnd(vector<int> &data ,int k, int left, int right){
            if(left > right)
                return -1;
            int mid = left + (right - left) / 2;
            if(data[mid] == k){
                if((mid < data.size()-1 && data[mid+1] != k) || mid == data.size()-1)
                    return mid;
                else
                    left = mid + 1;
            }
            else if(data[mid] < k){
                left = mid + 1;
            }
            else{
                right = mid -1;
            }
            return FindEnd(data, k, left, right);
        }
    };

    Java

    public class Solution {
        public int GetNumberOfK(int [] array , int k) {
           if(array.length == 0){
                return 0;
            }
            int l = FindFirst(array, k, 0, array.length-1);
            int r = FindEnd(array, k, 0, array.length-1);
            if(r != -1 && l != -1)
                return r-l+1;
            else
                return 0;
        }
        int FindFirst(int [] array ,int k, int left, int right){
            if(left > right)
                return -1;
            int mid = left + (right - left) / 2;
            if(array[mid] == k){
                if((mid > 0 && array[mid-1] != k) || mid == 0)
                    return mid;
                else
                    right = mid - 1;
            }
            else if(array[mid] < k){
                left = mid + 1;
            }
            else{
                right = mid -1;
            }
            return FindFirst(array, k, left, right);
        }
        int FindEnd(int [] array ,int k, int left, int right){
            if(left > right)
                return -1;
            int mid = left + (right - left) / 2;
            if(array[mid] == k){
                if((mid < array.length-1 && array[mid+1] != k) || mid == array.length-1)
                    return mid;
                else
                    left = mid + 1;
            }
            else if(array[mid] < k){
                left = mid + 1;
            }
            else{
                right = mid -1;
            }
            return FindEnd(array, k, left, right);
        }
    }
  • 相关阅读:
    2014最后一篇英语笔记(新开始)
    记录:CSS特殊性——权值规则
    grunt--自动化打包工具使用
    【移动端】---点透事件
    [前端性能提升]--图片转化为base64
    js--cookie
    1.倒数几秒弹窗关闭
    ES6就是ES2015 的主要内容
    call 与 apply的区别
    34枚金币时间管理法
  • 原文地址:https://www.cnblogs.com/silentteller/p/12019837.html
Copyright © 2011-2022 走看看