二分查找

相关内容:

最全的二分查找模板请到:https://blog.csdn.net/qq_19446965/article/details/82184672

其余练习题1:https://www.cnblogs.com/rnanprince/p/11743414.html
二分查找(倍增法):https://blog.csdn.net/qq_19446965/article/details/102811021
其余练习题2:https://www.cnblogs.com/rnanprince/p/11761940.html
————————————————

【二分查找】

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回 -1

样例 1:

输入:nums = [1,2,2,4,5,5], target = 2
输出:1 或者 2

样例 2:

输入:nums = [1,2,2,4,5,5], target = 6
输出:-1
练习地址:https://www.lintcode.com/problem/classical-binary-search/description
class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if not nums and target < nums[0] or target > nums[-1]:
            return -1
        
        left = 0
        right = len(nums) - 1
        while(left +1 < right):
            mid = left + (right - left)//2
            if target > nums[mid]:
                left = mid
            else:
                right = mid
                
        if target == nums[right]:
            return right
        if target == nums[left]:
            return left
        
        return -1

【二分查找-有重复】

给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

样例  1:
	输入:[1,4,4,5,7,7,8,9,9,10],1
	输出: 0
	
	样例解释: 
	第一次出现在第0个位置。

样例 2:
	输入: [1, 2, 3, 3, 4, 5, 10],3
	输出: 2
	
	样例解释: 
	第一次出现在第2个位置
	
样例 3:
	输入: [1, 2, 3, 3, 4, 5, 10],6
	输出: -1
	
	样例解释: 
	没有出现过6, 返回-1
练习地址:https://www.lintcode.com/problem/first-position-of-target/description
class Solution:
    """
    @param nums: The integer array.
    @param target: Target to find.
    @return: The first position of target. Position starts from 0.
    """
    def binarySearch(self, nums, target):
        if not nums and target < nums[0] or target > nums[-1]:
            return -1
        
        left = 0
        right = len(nums) - 1
        while(left +1 < right):
            mid = left + (right - left)//2
            if target > nums[mid]:
                left = mid
            else:
                right = mid
              
        if target == nums[left]:
            return left  
        if target == nums[right]:
            return right
        
        return -1

【第一个错误的版本】

代码库的版本号是从 1 到 n 的整数。某一天,有人提交了错误版本的代码,因此造成自身及之后版本的代码在单元测试中均出错。请找出第一个错误的版本号。

你可以通过 isBadVersion 的接口来判断版本号 version 是否在单元测试中出错,具体接口详情和调用方法请见代码的注释部分。

样例

n = 5:

    isBadVersion(3) -> false
    isBadVersion(5) -> true
    isBadVersion(4) -> true

因此可以确定第四个版本是第一个错误版本。
练习地址:https://www.jiuzhang.com/solutions/first-bad-version/#tag-highlight-lang-python
    def firstBadVersion(self, n):
        """
        :type n: int
        :rtype: int
        """
        if isBadVersion(1):
            return 1
        
        left = 1
        right = n
        while left + 1 < right:
            mid = left + (right - left)//2
            if not isBadVersion(mid):
                left = mid
            else:
                right = mid
        
        return right

 

【题目4】

给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

如果目标值不在数组中,则返回[-1, -1]

例1:

输入:
[]
9
输出:
[-1,-1]

例2:

输入:
[5, 7, 7, 8, 8, 10]
8
输出:
[3, 4]
练习地址:https://www.lintcode.com/problem/search-for-a-range/description

第一种:
class Solution:
    """
    @param A: an integer sorted array
    @param target: an integer to be inserted
    @return: a list of length 2, [index1, index2]
    """
    def searchRange(self, A, target):
        nums = A
        if not nums or target > nums[-1] or target < nums[0]:
            return [-1, -1]
             
        left = 0
        right = len(nums) - 1
        while left + 1 < right:
            mid = left + (right - left)//2
            if nums[left] == target and nums[right] == target:
                return [left, right]
            if target > nums[mid]:
                left = mid
            elif target < nums[mid]:
                right = mid
            elif target > nums[left]:
                left += 1
            elif target < nums[right]:
                right -= 1
        
        if nums[left] != target:
            left += 1
        if nums[right] != target:
            right -= 1
        if nums[left] == target and nums[right] == target:
            return [left, right]
            
        return [-1, -1]

第二种:

class Solution:
    """
    @param A: an integer sorted array
    @param target: an integer to be inserted
    @return: a list of length 2, [index1, index2]
    """
    def searchRange(self, A, target):
        # write your code here
        nums = A
        if nums and (target > nums[-1] or target < nums[0]):
            return [-1, -1]
            
        left = 0
        right = len(nums) - 1 
        while left <= right:
            mid = left + (right - left)//2
            if nums[left] == target and nums[right] == target:
                return [left, right]
            if target > nums[mid]:
                left = mid + 1
            elif target < nums[mid]:
                right = mid - 1
            elif target > nums[left]:
                left += 1
            elif target < nums[right]:
                right -= 1
                
        return [-1, -1]

 
posted @ 2019-10-27 01:01  知是行之始,行是知之成  阅读(240)  评论(0编辑  收藏  举报