题解 | 数字在升序数组中出现的次数

数字在升序数组中出现的次数

https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2

#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @param k int整型
     * @return int整型
     */

    int GetLen(vector<int>& nums, int left, int right, float k) {
        int mid;
        while (left <= right) {
            mid = (left + right) / 2;
            if (k < nums[mid])  right = mid - 1;
            if (k > nums[mid])  left = mid + 1;
        }
        return left;
    }
    int GetNumberOfK(vector<int>& nums, int k) {
        // write code here
        if (nums.empty()) return 0;
        int left = 0, right = nums.size() - 1;
        return GetLen(nums, left, right, k+0.5)-GetLen(nums, left, right, k-0.5);
    }
};

二分的精髓在于左边只有小的时候才移动,右边只有大的时候才移动,所以每次检验一定是左边比要找到的小于等于,右边一定是大于等于要找的。

那么最后两个一定是要找的东西的两边值(即使一边有出界可能),根据整除特性,会找到left那个作为最后的mid,这个值是小于要求的值的,所以left会到比这个东西大的地方去。

因此我们找到的左值一定是比这个东西大的最小值,也就是说我的代码会找到k值第一个和k+1值第一个,两个坐标相减就会是k的持续长度(k出现的次数)。

时间复杂度为O(logn),空间复杂度是O(1)。

全部评论

相关推荐

06-07 17:17
嘉兴学院 教师
心爱的idea:你孩
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-04 18:02
好不容易拿到了字节Offer,鼠鼠做后端的,但家里人觉得可能被裁员不稳定,让鼠鼠去投国企,现在好纠结到底该咋选
文档传偷助手:该投就投吧,不过建议别放弃offer 拿到手里的才是最好的
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务