Python Leetcode 刷题指南[视频]

237 阅读2分钟
原文链接: zhuanlan.zhihu.com

Python Leetcode 刷题指南

很多公司面试开始找leetcode原题了,开这个专栏总结下 python 刷 leetcode 题目的经验。不得不说这几年的面试难度逐年递增,前几年可能你手写快排,归并就差不多了,这几年开始直接找原题,学习很多硅谷公司(要是能开到人家的工资也可以啊)。我本人可能会用视频的方式投稿多一些,如果大家想要投稿文章尽量包含以下内容:

  • 文章标题。leetcode 题目作为题目标题。(包含中文和英文标题最好)
  • 题目链接和描述。方便直接看题意,不用跳转。(文章能自包含)
  • 解题思路。思考的过程(解题思维比较重要)等,解题方法,使用到的算法和数据结构等。
  • python 代码。本专栏主要面向使用 python 的开发者,争取较为 pythonic 的解法
  • 遇到的坑,比如一开始思路不对后来修改之后又对了;多重解法;参考资料链接等

这里给一个简单的例子,就是这个视频示例:

标题: merge-k-sorted-lists(合并 k 个有序链表)

题目链接:https://leetcode.com/problems/merge-k-sorted-lists/

描述:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

思路:经常见到合并两个链表的,一开始想的是先合并两个,之后再和后边的每一个链表合并。提交之后超时(TLE) 了。 这种解法会涉及到大量的重复比较,每次两两合并完成之后更长的链表和都要和下一个链表一一比较然后合并。后来考虑到可以最小堆解决, 把所有的链表元素读入一个最小堆里,然后每次从堆取出一个最小元素构造成一个新链表,提交通过。堆可以用 python heapq 模块快速实现。

from heapq import heappop, heapify
# Definition for singly-linked list.


#class ListNode:
#    def __init__(self, x):
#        self.val = x
#        self.next = None


class Solution:
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        h = []
        for node in lists:
            while node:
                h.append(node.val)
                node = node.next

        if not h:  # 注意这里的边界值 [[]]
            return None
        heapify(h)   # inplace 建堆
        root = ListNode(heappop(h))
        curnode = root

        while h:
            nextnode = ListNode(heappop(h))
            curnode.next = nextnode

            curnode = nextnode

        return root

这样就把一道题基本描述清楚了,欢迎大家投稿哈。