剑指 Offer 53 - I. 在排序数组中查找数字

剑指 Offer 53 - I. 在排序数组中查找数字,第1张

剑指 Offer 53 - I. 在排序数组中查找数字

剑指 Offer 53 - I. 在排序数组中查找数字 I - 力扣(LeetCode) (leetcode-cn.com)

首先放上运行结果

思路

所有的查找都是二分查找。首先查找到一个target出现的位置,然后再在这个位置之前找到target首次出现的位置的前一个位置,然后再在这个位置之后找到target最后一次出现的位置,两个位置之差即为target出现的总次数。

代码
class Solution {
public:
    int search(vector& nums, int target) {
        int beg = 0, end = nums.size(), mid;
        while ((mid = beg + (end - beg) / 2) != end) {
            if (nums[mid] > target) end = mid;
            else if (nums[mid] < target) beg = mid + 1;
            else return get_end(nums, beg, end, target) - get_front(nums, beg, end, target);
        }
        return 0;
    }

    int get_front(vector& nums, int beg, int end, int target) {
        if (nums[beg] == target) return beg - 1;
        int mid, halfsize;
        while (halfsize = (end - beg) / 2) {
            mid = beg + halfsize;
            nums[mid] != target ? beg = mid : end = mid;
        }
        return beg;
    }

    int get_end(vector& nums, int beg, int end, int target) {
        int mid, halfsize;
        while (halfsize = (end - beg) / 2) {
            mid = beg + halfsize;
            nums[mid] == target ? beg = mid : end = mid;
        }
        return beg;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5703067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存