1. 程式人生 > 實用技巧 >【演算法】【二分】Leetcode二分問題總結

【演算法】【二分】Leetcode二分問題總結

在排序陣列中查詢數字

題目連結:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size() - 1;
        int l = 0;
        int r = n;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        cout << r << endl;
        int res = 0;
        int i = l;
        while(i <= n && nums[i++] == target)
            res++;
        return res;
    }
};

搜尋旋轉排序陣列

題目連結:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        if(n == 0) return -1;

        int l = 0, r = n - 1;
        while(l < r)
        {
            int mid = (l + r + 1) >> 1;
            if(nums[mid] >= nums[0])
                l = mid;
            else
                r = mid - 1;
        }
   
        if (target >= nums[0]){
            // left
            l = 0;
        } else {
            // right
            l = r + 1;
            r = n - 1;
        }

        while(l < r)
        {
            int mid = (l + r) >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        return nums[r] == target ? r : -1;
    }
};

在排序陣列中查詢元素的第一個和最後一個位置

題目連結:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.size() == 0) return {-1, -1};
        vector<int> res(2, -1);
        res[0] = left(nums, target);
        res[1] = right(nums, target);
    
        return res;
    }
    int left(vector<int>& nums, int target)
    {
        int n = nums.size();
        int l = 0, r = n - 1;
        while(l < r)
        {
            int mid = (l + r)  >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        return target != nums[l] ? -1 : l;
    }

    int right(vector<int>& nums, int target)
    {
        int n = nums.size();
        int l = 0, r = n - 1;
        while(l < r)
        {
            int mid = (l + r + 1)  >> 1;
            if(nums[mid] <= target) l = mid;
            else r = mid - 1;
        }
        return target != nums[l] ? -1 : l;
    }
};