Leetcode刷题 - 改进版二分查找

704. 二分查找 - Binary Search

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int middle, left = 0;
        int right = nums.size()-1;
        while (left <= right){
            /** 可移动窗口的中位数算法 **/
            middle = left + (right - left)/2;
            if (nums[middle] == target) return middle;
            if (nums[middle] > target){
                right = middle - 1;
            }else if (nums[middle] < target){
                left = middle + 1;
            }
        }
        return -1;
        
    }
};

 744. 查找大于目标的最小字母 - Find Smallest Letter Greater Than Target

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        // 很简单的查找
        for (char c: letters)
            if (c > target) return c;
        return letters[0];
}

也可以强行使用二分法

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
         int left = 0, right = letters.size() -1;
         while (left <=right){
             int middle = left + (right - left)/2;
             if (letters[middle] > target)
                 right = middle;
             else
                 left = middle + 1; // 
         }
         return letters[left % letters.size()]; //防止超出边界
    }
};

34.  查找排序数组中元素的第一个位置和最后一个位置 -  Find First and Last Position of Element in Sorted Array

class Solution {
public:
    int binarySearch(vector<int>& nums, int target, bool first){
        int left = 0, right = nums.size() - 1, result = -1;
        while (left <= right){
            int middle = left + (right - left)/2;
            if (nums[middle] == target){
                result = middle;
                // 如果是第一次则找左边的index
                // 若是第二次则找右边的index
                first == true ? right = middle - 1 : left = middle + 1;
            }
            else if (nums[middle] < target) left = middle + 1;
            else right = middle - 1;
        }
        return result;
            
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        return {binarySearch(nums, target, true), binarySearch(nums, target, false)};
    }
       
};

 33. 在旋转排序数组中搜索 - Search in Rotated Sorted Array

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //由于可能会翻转,要随时判断nums在begin, mid, end的大小关系
        int begin = 0, end = nums.size() - 1, middle = -1;
        while (begin <= end){
            int middle = (end + begin)/2;
            if (nums[middle] == target) return middle;
            
            if (nums[begin] <= nums[middle]){
                if (target <= nums[middle] && target >= nums[begin])
                    end = middle - 1;
                else
                    begin = middle + 1;
                    
            }else{
                if (target >= nums[middle] && target <= nums[end])
                    begin = middle + 1;
                else
                    end = middle - 1;
            }
        }
        return -1;
    }
};

 

 

参考资料

  1. https://leetcode.com/problems/binary-search/
  2. https://leetcode.com/problems/find-smallest-letter-greater-than-target/
  3. https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
  4. https://leetcode.com/problems/search-in-rotated-sorted-array/

 

posted @ 2020-09-12 13:27  cancantrbl  阅读(179)  评论(0编辑  收藏  举报