代码随想录算法训练营第一天|704.二分查找,27.移除元素

文档参考:programmercarl.com

704.二分查找

二分查找适用于一个有序并且其中元素不重复的数组

二分查找有两种写法:左闭右闭,左闭右开

左闭右闭
class Solution_one(object):
    def search(self, nums, target):

        left = 0 #左区间
        right = len(nums) - 1 #右区间

        middle = left + (right - left)/2 #求中位数

        while(left <= right):
            if (nums[middle] < target):
                left = middle + 1 #区间变为[middle + 1, right]
            elif (nums[middle] > target):
                right = middle - 1 #区间变为[left, middle - 1]
            else:
                return middle
            middle = left + (right - left)/2
        return -1 #没查出结果,返回-1
左闭右开
class Solution(object):
    def search(self, nums, target):

        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

其实我能明白怎么写,但是我不知道该怎么解释这个逻辑,hh

这里我唯一感到惊奇的思路是计算middle时,利用left + (right - left) / 2这个地方,为了防止溢出问题,居然还可以这样

27.移除元素

移除元素,也就是删除元素,平常我都是两个for循环暴力破解,这次倒是学到了新方法——双指针法;

class Solution(object):
    def removeElement(self, nums, val):

        head, tail = 0, 0

        for i in range(len(nums)):
            while nums[head] == val:
                head += 1
                if head > len(nums) - 1:
                    return tail
            nums[tail] = nums[head]
            if head < len(nums) - 1:
                head += 1
                tail += 1
            else:
                return tail + 1

这个版本不是最简洁的版本,但却是我自己看懂那个小动画后,自己动手写出来的,虽然比较粗糙,但我比较好理解——while循环模拟head快指针一直往前走,碰到不同的值就把该值赋给tail慢指针,然后在不溢出的情况下,快指针和慢指针同时向前走一步

# 大佬版本
class Solution(object):
    def removeElement(self, nums, val):

        head, tail = 0, 0
        list_size = len(nums)

        while head < list_size:
            if nums[head] != val:
                nums[tail] = nums[head]
                tail += 1
            head += 1
        return tail

上面这个就是简洁版,确实简洁,心服口服

今天就只写了这些基本的算法题,害,万恶的考试周

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值