美文网首页皮皮的LeetCode刷题库
【剑指Offer】037——数字在排序数组中出现的次数 (数组)

【剑指Offer】037——数字在排序数组中出现的次数 (数组)

作者: 就问皮不皮 | 来源:发表于2019-08-20 18:01 被阅读0次

    题目描述

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

    解题思路

    正常的思路就是二分查找了,我们用递归的方法实现了查找k第一次出现的下标,用循环的方法实现了查找k最后一次出现的下标。
    除此之外,还有另一种奇妙的思路,因为data中都是整数,所以我们不用搜索k的两个位置,而是直接搜索k-0.5和k+0.5这两个数应该插入的位置,然后相减即可。

    参考代码

    Java

    public class Solution {
        public int GetNumberOfK(int[] array , int k) {
            int len = array.length;
            if (len == 0) return 0;
            int first = getFirst(array, k, 0, len -1); // 获取第一次出现k的索引
            int last = getLast(array, k, 0, len -1); // 获取最后一次出现k的索引
            // 确保查询到
            if (first != -1 && last != -1){
                return  last - first + 1;
            }
            return 0;
        }
        public int getFirst(int[] array, int k, int start, int end){
            int mid;
            // 查找 数据k的左边开始的那个索引
            while (start <= end){
                mid = start + (end - start) / 2;
                if (k <= array[mid]) end = mid - 1;
                else start = mid + 1;
            }
            // 确保在while循环中找到, start向右走
            if (start < array.length && array[start] == k) return start;
            else return -1;
        }
        public int getLast(int[] array, int k, int start, int end){
            int mid;
            while (start <= end){
                mid = start + (end - start) / 2;
                if (k>= array[mid]) start = mid + 1;
                else end = mid - 1;
            }
            // end 向左走
            if (end >= 0 && array[end] == k) return end;
            else return -1;
        }
        public int GetNumberOfK2(int[] array , int k){
            return biSearch(array, k + 0.5) - biSearch(array, k - 0.5);
        }
        // 查找
        public int biSearch(int[] array, double k){
            int start = 0, end = array.length - 1;
            while (start <= end){
                int mid = start + (end - start) / 2;
                if (array[mid] > k) end = mid - 1;
                else start = mid + 1;
            }
            return start;
        }
    }
    

    Python

    # -*- coding:utf-8 -*-
    class Solution:
        def GetNumberOfK(self, data, k):
            # write code here
            return self.biSearch(data, k + 0.5) - self.biSearch(data, k - 0.5)
        def biSearch(self, data, k):
            start, end = 0, len(data)  - 1
            while start <= end:
                mid = start + (end - start)/2
                if data[mid] > k: end = mid - 1
                else: start = mid + 1
            return start
    

    个人订阅号

    image

    相关文章

      网友评论

        本文标题:【剑指Offer】037——数字在排序数组中出现的次数 (数组)

        本文链接:https://www.haomeiwen.com/subject/owqmsctx.html