一枚菜鸟的leetcode刷题笔记 - Day4

这篇博客探讨了如何利用排序和双指针技术解决编程问题,如找到数组中与目标值最接近的三数之和,以及有效地判断括号字符串的有效性。此外,还介绍了如何合并两个递增排序的链表,强调了在处理链表问题时避免复杂结构调整的重要性。这些算法在实际编程挑战中非常常见,对于提升编程能力至关重要。
摘要由CSDN通过智能技术生成

16 - 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        nums.sort()
        ans = float('inf')  #表示返回值,即最接近的三个数的和

        for p1 in range(n):
            p2, p3 = p1+1, n-1
            while p2 < p3:
                temp = nums[p1] + nums[p2] + nums[p3]
                if abs(temp-target) < abs(ans-target):
                    ans = temp
                if temp == target:
                    return target
                elif temp > target:
                    p3 -= 1
                else:
                    p2 += 1
        return ans

这一题和最大容器那一题很像,和三数之和也很像。
使用排序加双指针可解。

官方答案

20 - 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。
class Solution:
    def isValid(self, s: str) -> bool:
        l = []
        for i in range(len(s)):
            l.append(s[i])
            if s[i] == ')':
                l.pop()
                if not l:
                    return False
                if l.pop() != '(':
                    return False
            if s[i] == ']':
                l.pop()
                if not l:
                    return False
                if l.pop() != '[':
                    return False
            if s[i] == '}':
                l.pop()
                if not l:
                    return False
                if l.pop() != '{':
                    return False
        if not l:
            return True
        else:
            return False

用栈,当碰到 ‘)’, ‘]’, ‘}’ 时,弹出该字符并判断下一个字符是否为 ‘(’, ‘[, ‘{’
但是需要注意第二次弹出时栈为空的情况,例如s=’]’

剑指Offer 25 / 21 - 合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(0)
        rehead = head
        while l1 and l2:
            if l1.val < l2.val:
                head.next = l1
                l1 = l1.next
            else:
                head.next = l2
                l2 = l2.next
            head = head.next
        head.next = l1 if l1 else l2
        return rehead.next

这题走了不少弯路,我一直想的是改变l1或l2的结构和链接,但这样的话弯弯绕绕特别多。不如直接创建一个新的链表,然后l1和l2的值,谁的值更小就把新链表的head指向谁。最后注意一下l1和l2其中一个为None另一个不为None时的处理。用到了三元表示法【Python 三元表达式写法A if x else B,代表当x=True时执行A,否则执行B】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值