1. 程式人生 > 實用技巧 >【LeetCode-查詢】在排序陣列中查詢數字 I

【LeetCode-查詢】在排序陣列中查詢數字 I

題目描述

統計一個數字在排序陣列中出現的次數。
示例:

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: 2

輸入: nums = [5,7,7,8,8,10], target = 6
輸出: 0

說明: 0 <= 陣列長度 <= 50000
題目連結: https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/

思路

因為是排序的陣列,所以使用二分查詢。使用和在排序陣列中查詢元素的第一個和最後一個位置一樣的方法查詢 target 的左邊界 left 和右邊界 right。如果 target 在陣列中,則返回 right-left+1,否則返回 0 。

程式碼如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int first = find(nums, target, true);
        int last = find(nums, target, false);
        if(first==-1 || last==-1) return 0;
        return last-first+1;
    }

    int find(vector<int>& nums, int target, bool findFirst){
        int left = 0;
        int right = nums.size()-1;
        while(left<=right){
            int mid = left + (right-left)/2;
            if(nums[mid]>target) right = mid-1;
            else if(nums[mid]<target) left = mid+1;
            else if(nums[mid]==target){
                if(findFirst){
                    if(mid>0 && nums[mid-1]==nums[mid]) right = mid-1;
                    else return mid;
                }else{
                    if(mid<nums.size()-1 && nums[mid]==nums[mid+1]) left = mid+1;
                    else return mid;
                }
            }
        }
        return -1;
    }
};
  • 時間複雜度:O(logn)
  • 空間複雜度:O(1)