NO1 : 堆排
使用最小堆,即堆顶(root) 为最小元素 堆-完全二叉树
找到第K个最大元素 转化为
1. 随机建立大小为k的最小堆
2. 迭代剩余元素,比较剩余元素与堆顶元素大小;若比堆顶小,则过,若比堆顶大,则先出堆,再入堆该元素
3. 目的:找到K个最大元素构成的最小堆,堆顶即为第K个最大元素
* heapq中的heapify、heappop及heappush的复杂度都为线性的
import heapq
class solution:
def findklargest(self,nums,k):
res = nums[:k]
heapify(res)
for num in nums[k:]:
if num > res[0]:
heappop(res)
heappush(res,num)
return res[0]
NO2:快排
NO1:迭代
pre指向上一个元素,curr指向当前元素
遍历列表中每一个元素:
1. 使得curr.next指向上一个元素
2. pre更新到curr,curr更新到原next元素(tmp保存)
class Solution:
def reverselist(self, head):
pre = None
curr = head
while curr:
tmp = curr.next
curr.next = pre
pre = curr
curr = tmp
return pre
NO2:递归
由于使用递归方法,首先需要思考子问题及递归结束条件
子问题是对子链表进行反转(从尾部开始反转)
递归结束条件 - 遇到输入指针为空
class Solution:
def reverseList(self, head):
if (not head) or (not head.next):
return head
cur = self.reverseList(head.next)
# 当返回最后一个元素时,使最后一个元素next指针指向当前的head元素且head元素next指针指向null,返回最后一个元素的指针(* head上一个元素以及最后一个元素的next指针同时指向当前head元素)
head.next.next = head
head.next = None
return cur
递归三部曲:
确定递归函数参数以及返回值 -> 确定终止条件 -> 确定单层递归逻辑