二分查找 && 三分查找

LeetCode34. Find First and Last Position of Element in Sorted Array

题意:找出指定元素出现的范围,Ologn

思路:两次二分

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        int lx = -1, rx = -1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (nums[mid] < target) {
                l = mid + 1;
            } else if (nums[mid] > target) {
                r = mid - 1;
            } else {
                lx = mid;
                r = mid - 1;
            }
        }
        l = 0, r = nums.size() - 1;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (nums[mid] < target) {
                l = mid + 1;
            } else if (nums[mid] > target) {
                r = mid - 1;
            } else {
                rx = mid;
                l = mid + 1;
            }
        }
        vector<int> res;
        res.push_back(lx);
        res.push_back(rx);
        return res;
    }
};
View Code

 

LeetCode33. Search in Rotated Sorted Array

在旋转过的有序数组中查找指定元素

二分查找就是判断target在前一半还是后一半,根据mid和两端元素的大小可以得到哪一半是有序的

就可以判断target在不在这一半里

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

 

posted @ 2019-02-01 22:25  舒羽倾  阅读(601)  评论(0编辑  收藏  举报