每日一練(24):在排序陣列中查詢數字

加班猿發表於2022-03-01

title: 每日一練(24):在排序陣列中查詢數字

categories:[劍指offer]

tags:[每日一練]

date: 2022/02/23


每日一練(24):在排序陣列中查詢數字

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

示例 1:

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

輸出: 2

示例 2:

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

輸出: 0

提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

nums 是一個非遞減陣列

-109 <= target <= 109

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一:STL(一行搞定)

count函式可以用來統計字串中某個字元的個數

使用方法是count(ivec.begin() , ivec.end() , searchValue),其中begin指的是起始地址,end指的是結束地址,第三個引數指的是需要查詢的字元。

int search(vector<int>& nums, int target) {
    return count(nums.begin(),nums.end(),target);
}

方法二:暴力解法

直接for迴圈遍歷查詢目標並計數

int search(vector<int>& nums, int target) {
    if (nums.size() == 0) {
        return 0;
    }
    if (nums.size() == 1) {
        if (nums[0] == target) {
            return 1;
        } else {
            return 0;
        }
    }
    int count = 0;
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] == target) {
            count++;    //迴圈計數
        }
    }
    return count;
}

方法三:二分查詢

二分模板:

模板1

當我們將區間[l, r]劃分成[l, mid]和[mid + 1, r]時,其更新操作是r = mid或者l = mid + 1,計算mid時不需要加1,即mid = (l + r)/2。

int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = (l + r)/2;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

模板2

當我們將區間[l, r]劃分成[l, mid - 1]和[mid, r]時,其更新操作是r = mid - 1或者l = mid,此時為了防止死迴圈,計算mid時需要加1,即mid = ( l + r + 1 ) /2。

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = ( l + r + 1 ) /2;
        if (check(mid)) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }
    return l;
}
  • lowerBound(target)
  • upper(target+1)

時間複雜度分析: 兩次二分查詢的時間複雜度為 O(logn)。

空間複雜度分析: 沒有使用額外的陣列,因此空間複雜度為O(1)。

int lowerBound(vector<int>& nums, int target) {
    int l, r;
    l = 0;
    r = nums.size();
    while (l < r) {
        int mid = (l + r) >> 1;
        if (target <= nums[mid]) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return l;
}
int search(vector<int>& nums, int target) {
    int lower = lowerBound(nums, target);
    int upper = lowerBound(nums, target + 1);
    return (upper - lower);
}

相關文章