Lintcode二分法题目刷题总结-使用python语言-参考九章算法课程配套习题,由易到难,梯度设置合理

458. 目标最后位置

给一个升序数组,找到 target 最后一次出现的位置,如果没出现过返回 -1

样例 1:
输入:nums = [1,2,2,4,5,5], target = 2
输出:2

样例 2:
输入:nums = [1,2,2,4,5,5], target = 6
输出:-1

class Solution:
    """
    @param nums: An integer array sorted in ascending order
    @param target: An integer
    @return: An integer
    """
    def lastPosition(self, nums, target):
        # write your code here
        # last position问题,升序数组,可能有重复
        start = 0
        end = len(nums) - 1
        
        if nums == None or len(nums) == 0:
            return -1
        
        while start + 1 < end:
            mid = start + (end - start) // 2
            # last position问题,先缩小范围
            if nums[mid] <= target:
                start = mid
            else:
                end = mid
        # 先判断end,等于target的话,返回索引。
        if nums[end] == target:
            return end
        if nums[start] == target:
            return start
        return -1

585. 山脉序列中的最大值

给 n 个整数的山脉数组,即先增后减的序列,找到山顶(最大值)

例1:

输入: nums = [1, 2, 4, 8, 6, 3]
输出: 8

例2:
输入: nums = [10, 9, 8, 7],
输出: 10
注意事项
数组严格递增,严格递减

class Solution:
    """
    @param nums: a mountain sequence which increase firstly and then decrease
    @return: then mountain top
    """
    def mountainSequence(self, nums):
        # write your code here
        # 不是first/last position问题了,通过二分逐步缩小范围
        # 长度应该是默认大于等于3的
        start = 0
        end = len(nums) - 1
        
        while start + 1 < end:
            mid = start + (end - start) // 2
            # nums[mid]恰好是最大的情况
            if nums[mid] > nums[mid-1] and nums[mid] > nums[mid+1]:
                return nums[mid]
            # nums[mid]是左边最大的情况
            elif nums[mid] > nums[mid-1] and nums[mid] < nums[mid+1]:
                start = mid
            # nums[mid]是右边最大的情况
            elif nums[mid] > nums[mid+1] and nums[mid] < nums[mid-1]:
                end = mid
        # 考虑只有递增或者只有递减的情况
        if nums[start] > nums[end]:
            return nums[start]
        else:
            return nums[end]

你可能感兴趣的:(Coding练习,python,算法,二分法)