codetop 微软 2/263

215. 数组中的第K个最大元素

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:快排

206. 反转链表

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

递归三部曲:

确定递归函数参数以及返回值 -> 确定终止条件 -> 确定单层递归逻辑 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值