目录
一、Leetcode189轮转数组
题目描述
给定一个整数数组 nums ,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
题目链接:力扣题目链接
解题思路
- 切片思想
方法:切片
- 因为轮转后切片内顺序不变
- 将区间调转位置[-k:],[:-k]
- !!!当k大于数组长度的时候,要取余
python
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 当k大于数组长度时
k = k % len(nums)
n1 = nums[-k:]
n2 = nums[: -k]
nums[:] = n1 + n2
总结
- 切片思想非常好用
- 轮转的时候注意k的大小
- 注意语法[ : ] = [ :-k] + [-k: ]
二、Leetcode56合并区间
题目描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
题目链接:力扣题目链接
解题思路
- 合并区间,比较上一个区间的右区间和下一个区间的左区间
方法:
- 先排序
- 判断加入区间/更新区间的条件
- 加入区间:
merge为空,上一个区间的右区间小于下一个区间的左区间[1,3],[4,5] - 更新区间:
上一个区间的右区间大于下一个区间的左区间
!!!更新右区间=这两个区间右区间的最大值
python
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 根据每个区间的左区间进行排序
intervals.sort(key = lambda x: x[0])
merge = []
for i in intervals:
if not merge or merge[-1][1] < i[0]:
merge.append(i)
else:
merge[-1][1] = max(merge[-1][1], i[1])
return merge
总结
- 二维数组排序
s.sort(key = lambda x: x[0]) - 多列几个例子就知道合并的逻辑了
三、Leetcode21合并两个有序链表
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目链接:力扣题目链接
解题思路
- 比合并区间简单,链表合并只用比大小
- 小的加入,剩的加入
方法:
- 新建一个空节点dummy,用merge遍历,最终返回dummy.next
- 当两个链表节点都存在时,哪个小就连上哪个
- 当只剩一个链表时,将剩下的链表之间连过来
python
# 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, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode()
merge = dummy
cur1 = list1
cur2 = list2
while cur1 and cur2:
if cur1.val <= cur2.val:
merge.next = cur1
cur1 = cur1.next
else:
merge.next = cur2
cur2 = cur2.next
merge = merge.next
# 剩余节点直接连过来
if cur1:
merge.next = cur1
else:
merge.next = cur2
return dummy.next
总结
- 剩余链表可以通过节点之间连过来
if cur1:
merge.next = cur1
四、Leetcode2两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题目链接:力扣题目链接
解题思路
- 注意存储进位的值
方法:
- while循环只要有一个链表没走完就继续走,走完的为0
- 注意最后如果还有进位,要用merge.next存完!!!
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
cur1 = l1
cur2 = l2
dummy = ListNode()
merge = dummy
pre = 0
while cur1 or cur2:
val1 = cur1.val if cur1 else 0
val2 = cur2.val if cur2 else 0
total = val1 + val2 + pre
# 处理进位
pre = total // 10
merge.next = ListNode(total % 10)
merge = merge.next
# 移动到下一个节点
if cur1:
cur1 = cur1.next
if cur2:
cur2 = cur2.next
if pre:
merge.next = ListNode(pre)
return dummy.next
总结
-
新建链表都是:
dummy = ListNode()
merge = dummy
用merge.next继续走,最终返回dummy.next
-
进位值等于pre // 10
-
注意最终剩下的进位也要用merge.next存!!!
sql总结:
-
sql中 值的比较用=
where id % 2 = 1
-
日期范围用between...and...
activity_date between "2019-06-28" and "2019-07-27"
心得:就算是春招也要坚持刷算法~!!缓解焦虑就刷力扣!!虽然刷的慢,但希望刷过的算法都会用!!!