链表:
创建
class Node: # 结点类def __init__(self, data):self.data = dataself.next = Noneclass SingleLinkList: # 单链表类def __init__(self):self.head = Noneself.tail = Nonedef append(self, x): # 单链表尾部追加方法if self.head is None:self.head = self.tail = Node(x)else:self.tail.next = Node(x)self.tail = self.tail.nexttest_link = SingleLinkList()for i in range(1, 8):test_link.append(i)p = test_link.headwhile p is not None:p = p.next
逆序
指针方法
# -*- coding:utf-8 -*-class ListNode:def __init__(self, x, next):self.val = xself.next = nextclass Solution:# 返回ListNodedef ReverseList(self, pHead):p1 = pHeadp2 = p1.nextpHead.next = Nonewhile p2 is not None:p3 = p2.nextp2.next = p1p1 = p2p2 = p3return p1
数组中差值最少的两个数
def subtract(lst):"""求输入中差值最小的两个数"""lst.sort() # 排序,递增,确保下面迭代部分顺序dd = float("inf") # 初始一个无穷值for i in range(len(lst) - 1):x, y = lst[i], lst[i + 1]if x == y:continued = abs(x - y)if d < dd: # 条件是最少,所以dd值除无穷大,确保第一次肯定执行xx, yy, dd = x, y, d # 第一次执行时dd这个无穷大的值会变成(x - y)的绝对值d,相当于给dd这个条件值赋一个初始值return xx, yy
lru_cache(Least Recently Used 缓存算法)
from functools import lru_cache@lru_cache(maxsize=30) # maxsize参数告诉lru_cache缓存最近多少个返回值def fib(n):if n < 2:return nreturn fib(n-1) + fib(n-2)print([fib(n) for n in range(10)])fib.cache_clear() # 清空缓存
class Solution:def LRU(self, operators, k):# write code hered1 = OrderedDict()res = []for li in operators:if len(li) == 2:# getv = d1.get(li[1], -1) # 取li(key)映射的val,取不到默认-1res.append(v) # 主输出if v != -1:d1.move_to_end(li[1], last=False) # 排序移到最后else:if len(d1) < k:# setd1[li[1]] = li[2]d1.move_to_end(li[1], last=False)else:# deleted1.popitem(last=True)# setd1[li[1]] = li[2]d1.move_to_end(li[1], last=False)return res
栈
匹配括号
def isvalid(s: str) -> bool:stack = [] # 设置一个列表,把该列表当做栈来使用即可。dic = {')': '(', '}': '{', ']': '['} # 使用字典存储括号,并且右括号为key,左括号为valuev = dic.values()for char in s:if char in v: # 左括号就入栈stack.append(char)elif char in dic: # 有右括号的话就进行比较,if stack==[] or dic[char]!=stack.pop():return Falseelse:return False # 不再字典中的输入直接输出错误return stack==[]
每日温度
def dailyTemperatures(temperatures: iter):stack = list()out = [0] * len(temperatures)for i, per_temp in enumerate(temperatures):while len(stack):_ = stack.pop()if per_temp > _[1]:index = _[0]out[index] = i - indexelse:stack.append(_)breakstack.append((i, per_temp))return out
双向队列
滑动窗口最大值
def dequeue(nums: iter, k):"""保持一个最大为K的dequeue(简称dq)1、保证最左为dq中的最大值2、以栈形式比较大小2.1、每当有新的最大值时,栈比较出掉对比当前小的值2.2、当len(dq) > k,以队列方式出掉值"""dq = deque()ans = []for i in range(len(nums)):# 只要当前遍历的元素的值比队尾大,让队尾出队列,# 最终队列中的最小元素是大于当前元素的while dq and dq[-1] < nums[i]:dq.pop()# 当前遍历的元素入队列, 此时队列中的元素一定是有序的,队列头部最大dq.append(nums[i])if i >= k - 1: # 超过k个才开始真正运算ans# 如果窗口即将失效(下一次循环要失效)的值与当前对列头部的值相同,那么将对头的值出队列,# 注意只pop一次,可能两个4,相邻同时是最大值,ans.append(dq[0])# 从队列中删除即将失效的数据if nums[i + 1 - k] == dq[0]:dq.popleft()return ans
指针
"""arr1长度n,arr2长度m"""# 方法1 暴力破解 直接合并后,(快速排序)时间复杂度O((m+n)log(m+n)),空间复杂度O(log(m+n))# 方法2 双指针
