【leetcode-python】704. 二分查找、27. 移除元素。

leetcode 704. 二分查找

题目链接:704.二分查找
文档讲解:704.二分查找-文档讲解
视频讲解:704.二分查找-视频讲解
思路:利用双指针,两个指针分别控制区间的左右边界。

  • 左闭右开:

    • 有效区间为[left,right),当left==right,例如[1,1),是没有意义的,所以循环体的边界不能包含left==right的条件,即while left <right
    • 同时,由于[left,right)是没有意义的,以right下标的元素是不包含在区间中的,所以此时right最右边的取值应该是(数组长度),即right = len(nums)
    • nums[middle] > target 的时候,target此时在[left,middle)区间中,此时以middle为下标的元素已经确定不满足条件了,所以right = middle,来确保[left,right)是有意义的,因为right本来就是取不到的;
    • nums[middle] < target 的时候,target此时在[middle,right)区间中,此时以middle为下标的元素已经确定不满足条件了,所以left = middle + 1
  • 左闭右闭:

    • 有效区间为[left,right],当left==right,例如[1,1],也是有意义的,所以循环体的边界要包含left==right的条件,即while left <=right
    • 同时,由于[left,right]是有意义的,以right下标的元素是包含在区间中的,所以此时right最右边的取值应该是(数组长度-1),即right = len(nums) - 1
    • nums[middle] > target 的时候,target此时在[left,middle)区间中,此时以middle为下标的元素已经确定不满足条件了,所以right = middle - 1,来确保[left,right]是有意义的;
    • nums[middle] < target 的时候,target此时在[middle,right]区间中,此时以middle为下标的元素已经确定不满足条件了,所以left = middle + 1

左闭右开

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # 左闭右开
        left = 0
        right = len(nums)   # 注意这里的区别
        while left < right:
            middle = left + (right - left) // 2
            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle   # 注意这里的区别
            else:
                return middle
        
        return -1

左闭右闭

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # 左闭右闭
        left = 0
        right = len(nums) - 1  # 注意这里的区别
        while left <= right:
            middle = left + (right - left) // 2
            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle - 1   # 注意这里的区别
            else:
                return middle
        
        return -1

leetcode 27.移除元素

题目链接:27.移除元素
文档讲解:27.移除元素-文档讲解
视频讲解:27.移除元素-视频讲解
思路:利用双指针,一个快指针遍历数组,一个慢指针控制保留的数组

快慢指针初始化的时候,同时指向第0号元素,fast快指针首先移动,如果nums[fast] == val,则fast += 1;如果不相等,则将fast指向的元素,赋值给slow指向的元素位置,即 nums[slow] = nums[fast],快慢指针同时移动一格,即fast += 1,slow += 1

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        if len(nums) == 0: return 0
        fast, slow =0, 0
        while fast < len(nums):
            if nums[fast] == val:
                fast += 1
            else:    
                nums[slow] = nums[fast]
                slow += 1
                fast += 1
        return slow
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miss.wei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值