写在最前面,编程一直是我的短板,希望在leetcode练习中获得进步!
参考Datawhale组队学习中“LeetCodeTencent”
算法评估
时间复杂度
问:O(log (m+n)) 是多长?怎么计算?
答:假设有
那么,
比如,O(log(n)) 折半查找,O(log (m+n))归并排序。
参考1图解
参考2算法举例
链表
定义
class Node(object):
"""单链表的结点"""
def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None
链表基本操作
参考
is_empty() 链表是否为空
length() 链表长度
items() 获取链表数据迭代器
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
find(item) 查找节点是否存在
两数相加
# 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: ListNode, l2: ListNode) -> ListNode:
anws = p = ListNode(None)
s = 0 # 初始化进位 s 为 0
while s or l1 or l2:
# 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)
s += (l1.val if l1 else 0)+(l2.val if l2 else 0)
p.next = ListNode(s % 10)
p = p.next
s //=10
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return anws.next
执行用时:60 ms, 在所有 Python3 提交中击败了99.32%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了5.15%的用户
二分查找
题号:4
难度:困难
4. 寻找两个正序数组的中位数
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
n1 = len(nums1)
n2 = len(nums2)
if n1 > n2:
return self.findMedianSortedArrays(nums2,nums1)
k = (n1 + n2 + 1)//2
left = 0
right = n1
while left < right :
m1 = left +(right - left)//2
m2 = k - m1
if nums1[m1] < nums2[m2-1]:
left = m1 + 1
else:
right = m1
m1 = left
m2 = k - m1
c1 = max(nums1[m1-1] if m1 > 0 else float("-inf"), nums2[m2-1] if m2 > 0 else float("-inf") )
if (n1 + n2) % 2 == 1:
return c1
c2 = min(nums1[m1] if m1 < n1 else float("inf"), nums2[m2] if m2 <n2 else float("inf"))
return (c1 + c2) / 2
执行用时:40 ms, 在所有 Python3 提交中击败了98.20%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了21.09%的用户
参考
动态规划
题号:5
难度:中等
5.最长回文
思路:
1-遍历一段子序列
2-判断首尾是否相等,若相等,剥掉一层,再判断首尾是否相等,一直到一个数,或者没有,那么该子序列为回文
3-遍历所有子序列之后,找到是回文中最长的子序列并返回。
class Solution:
def longestPalindrome(self, s: str) -> str:
size = len(s)
if size < 2:
return s
dp = [[False for _ in range(size)] for _ in range(size)]
max_len = 1
start = 0
for i in range(size):
dp[i][i] = True
for j in range(1, size):
for i in range(0, j):
if s[i] == s[j]:
if j - i < 3:
dp[i][j] = True
else:
dp[i][j] = dp[i + 1][j - 1]
else:
dp[i][j] = False
if dp[i][j]:
cur_len = j - i + 1
if cur_len > max_len:
max_len = cur_len
start = i
return s[start:start + max_len]
参考
执行用时:8452 ms, 在所有 Python3 提交中击败了17.00%的用户
内存消耗:23.1 MB, 在所有 Python3 提交中击败了5.41%的用户
评价 用时好长,空间用得也很多
目前,还是参考别人的代码为主,以上是汇总。继续加油!