python3 二分查找算法。leetcode 简单题部分记录

本文介绍了Python中使用二分法解决搜索插入位置问题,并探讨了回文数判断和有效括号验证的简洁解决方案。此外,还讨论了如何合并两个有序链表,包括链表的概念和操作。通过实例解析,加深了对算法和数据结构的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

35题 搜索插入位置

 

这个题其实python3 用3行就可以解决了,但是用index这种实在是面试官会直接给你挂掉的程度吧。。这样做题没有收获。看到要求是算法时间复杂度必须在logn。特意去学习了一下,也看了《算法图解》的二分法。搞明白之后写下来不知道怎么解决插入新元素的问题,在题解里看到了return left直接解决,写了几个例子才逐渐理解。

二分法的细节问题有一篇文章写得很好:​​​​​​二分查找详解 - labuladong - 博客园

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums) - 1
        while left <= right: 
            mid = (left + right) // 2
            obj = nums[mid]
            if obj == target:
                return mid
            if obj > target:
                right = mid - 1
            else:
                left = mid + 1
        return left

第3题 回文数

这个我用了很笨的办法,还变成了列表,就很。。冗杂

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        else:
            list_old = list(str(x))
            list_new = [str(x % 10)]
            for i in range(1, len(list_old)):
                list_new.append(str((x // (10 ** i)) % 10))
            if list_new == list_old:
                return True
            else:
                return False

但是在题解里学到了一个东西,可以直接倒放字符串:

class Solution:
    def isPalindrome(self, x: int) -> bool:
        return True if str(x) == str(x)[::-1] else False

第6题 有效的括号

本来想再想想的,不小心看了评论,直接满脑子只有这一个思路了。。。太妙了这个,而且我发现我遇到列表字符串会用的函数就那几个。啊啊啊啊

class Solution:
    def isValid(self, s: str) -> bool:
        while '()' in s or "{}" in s or '[]' in s:
            s = s.replace('()', '')
            s = s.replace('[]', '')
            s = s.replace('{}', '')
        return s == '' 

第7题 合并两个有序链表

才知道有链表这个概念... 和IDLE里用完全不一样,整个懵了。看了评论才知道各个函数怎么用,原来l1.val 只是一个值,l1 = l1.next 是链表里的下一个值。拿next作下一个值,小的放给新listnode,l1和l2选小的往后放。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        p = ListNode()
        ans = p
        while l1 and l2:
            if l1.val < l2.val:
                p.next = ListNode(l1.val)
                l1 = l1.next
            else:
                p.next = ListNode(l2.val)
                l2 = l2.next
            p = p.next
        if l1:
            p.next = l1
        else:
            p.next = l2
        return ans.next

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值