- 开始第4天的内容啦!各位小伙伴加油哦!
开源内容
DW&LeetCode_day4(1018、16、20、21)
写在前面:
开源内容
学习大纲
1018. 可被 5 整除的二进制前缀
题解:
16. 最接近的三数之和
题解:
20. 有效的括号
题解:
21. 合并两个有序链表
题解:
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。
返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。
示例 1:
输入:[0,1,1]
输出:[true,false,false]
解释:
输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。示例 2:
输入:[1,1,1]
输出:[false,false,false]
示例 3:输入:[0,1,1,1,1,1]
输出:[true,false,false,false,true,false]
示例 4:输入:[1,1,1,0,1]
输出:[false,false,false,false,false]
提示:
1 <= A.length <= 30000
A[i] 为 0 或 1链接:题目链接
题解:
class Solution: def prefixesDivBy5(self, A: List[int]) -> List[bool]: a = [] b = 0 for i in A: b = (b * 2 + i)% 5 #将前面的数乘2,再加上新增数并对5取余 if b == 0: a+=True else: a+=False return a
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
链接:题目链接题解:
# python 双指针加排序 class Solution: def threeSumClosest(self, a: List[int], target: int) -> int: a.sort() res = float('inf') for i in range(len(a)): if i == 0 or a[i]>a[i-1]: # 去重 left = i+1 right = len(a)-1 while left
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。示例 1:
输入: "()"
输出: true
示例 2:输入: "()[]{}"
输出: true
示例 3:输入: "(]"
输出: false
示例 4:输入: "([)]"
输出: false
示例 5:输入: "{[]}"
输出: true
链接:题目链接题解:
# python 语法糖 while '{}' in s or '()' in s or '[]' in s: s = s.replace('{}', '') s = s.replace('[]', '') s = s.replace('()', '') return s == ''
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:输入:l1 = [], l2 = []
输出:[]
示例 3:输入:l1 = [], l2 = [0]
输出:[0]
链接:题目链接题解:
# 一个详细的思路 --alex class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: #创建一个新的链表 res = ListNode(0) #一个指针指向新的链表的头部 c1 = res #开始比较L1和l2的值,只要有一个走完就停 while(l1 and l2): #如果l1的值小于等于l2的值,则加入新的链表同时移动L1 if l1.val<=l2.val: c1.next = ListNode(l1.val) l1 = l1.next c1 = c1.next #反之则添加l2的值,同时移动l2 else l1.val>l2.val: c1.next = ListNode(l2.val) l2= l2.next c1 =c1.next #检查L1和l2哪个没走完,则将后面的直接加入新的链表即可 if l1: c1.next = l1 if l2: c1.next = l2 #返回头部的下一个即可 return res.next
class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1 : return l2 #终止条件 if not l2 : return l1 if l1.val <= l2.val : #递归条件 return ListNode(l1.val, self.mergeTwoLists(l1.next, l2)) else: return ListNode(l2.val, self.mergeTwoLists(l1, l2.next))