二分搜索总结

一 普通二分搜索

LintCode 457. Classical BInary Search

public class Solution {
    /**
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    public int findPosition(int[] nums, int target) {
        // write your code here
        int ans = -1;
        if(nums == null || nums.length == 0)
            return ans;
        int L = 0;
        int R = nums.length - 1;
        while(L <= R) {
            int mid = L + ((R-L) >> 1);
            if(nums[mid] == target)
                return mid;                //如果找到了,则返回
            else if(nums[mid] > target)
                R = mid - 1;
            else
                L = mid + 1;
        }
        return ans;                   //跳出while了,肯定是没有找到
    }
}

二 查找满足条件的第一个位置

LintCode 14. First Position of Target

public class Solution {
    /**
     * @param nums: The integer array.
     * @param target: Target to find.
     * @return: The first position of target. Position starts from 0.
     */
    public int binarySearch(int[] nums, int target) {
        // write your code here
        int ans = -1;
        if(nums == null || nums.length == 0)
            return ans;
            
        int L = 0;
        int R = nums.length - 1;
        while(L <= R) {
            int mid = L + ((R-L) >> 1);
            
            if(nums[mid] >= target) {
                R = mid - 1;
                ans = nums[mid] == target ? mid : ans;
            }
            else {
                L = mid + 1;
            }
        }
        return ans;
    }
}

类似题目:

LintCode 74. First Bad Version

LeetCode 278. First Bad Version

三 查找满足条件的最后一个位置

LintCode 458. Last Position of Target

public class Solution {
    /**
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    public int lastPosition(int[] nums, int target) {
        // write your code here
        int ans = -1;
        if(nums == null || nums.length == 0)
            return ans;
        
        int L = 0;
        int R = nums.length - 1;
        while(L <= R) {
            int mid = L + ((R-L) >> 1);
            if(nums[mid] <= target) {
                L = mid + 1;
                ans = nums[mid] == target ? mid : ans;
            }
            else
                R = mid - 1; 
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/cunane/article/details/87901036
今日推荐