[Leetcode算法学习]:Leetcode模块Queue & Stack部分总结

Posted gradientboosted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode算法学习]:Leetcode模块Queue & Stack部分总结相关的知识,希望对你有一定的参考价值。

Leetcode中的Queue & Stack部分学习总结

Stack部分:733. Flood fill

以下代码可以作为DFS的新范式进行参考,代码较为简洁(毕竟头条写DFS模板时候被喷冗余的那一幕仍然历历在目= =)。

class Solution():
    def floodFill(self, image, sr, sc, newColor):
        if len(image) == 0:
            return image
        elif image[sr][sc] == newColor:
            return image
        
        self.fill(image, sr, sc, newColor, image[sr][sc])
        return image
    
    def fill(self, image, sr, sc, newColor, color):
        # 进入递归之前,先判断传入坐标合不合法,否则直接返回。
        if (sr < 0) or (sr > len(image) - 1) or (sc < 0) or (sc > len(image[0]) - 1) or (image[sr][sc] != color):
            return

        image[sr][sc] = newColor
        self.fill(image, sr-1, sc, newColor, color)
        self.fill(image, sc+1, sc, newColor, color)
        self.fill(image, sc, sr-1, newColor, color)
        self.fill(image, sc, sr+1, newColor, color)
        return

Queue部分:752. Open The Lock

以下题目作为BFS的范式进行参考,BTW,BFS的题目貌似做的比较少,应该要多多练习才行。

# 这里使用了Python原生collections中的dequeue类,也是双端队列高效的实现。
import collections
class Solution(object):
    def openLock(self, deadends, target):
        if target is None or target in deadends:
            return -1
        
        # Storing all deadends in a hash table
        deadends, visited, level = set(deadends), set(), 0
        queue = collections.deque()
        
        # Breath first search for the target
        queue.append("0000")
        
        while(len(queue) != 0):
            currSize, level = len(queue), level + 1
            
            for i in range(currSize):
                node = queue.popleft()
                
                # Early stop
                if node in deadends or node in visited:
                    continue
                
                # Current node possible adjacent nodes
                possibleLocks = []
                for i in range(4):
                    possibleLocks.append(node[:i] + str((int(node[i]) + 1) % 10) + node[(i+1):] )
                    possibleLocks.append(node[:i] + str((int(node[i]) + 9) % 10) + node[(i+1):] )
                
                # Travsel the possible nodes
                for j in possibleLocks:
                    if j == target:
                        return level
                    elif j not in deadends and j not in visited:
                        queue.append(j)
                visited.add(node)
        return -1

待续...

以上是关于[Leetcode算法学习]:Leetcode模块Queue & Stack部分总结的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode面试刷题技巧-二分查找算法(下):通过 LeetCode 学习二分查找算法-销售价值减少的颜色球

leetcode 刷500道题,笔试/面试稳过吗?谈一谈这些年来算法的学习

二分查找算法(下):通过 LeetCode 周赛学习二分查找算法

通过 LeetCode 周赛学习二分查找算法

大厂算法面试之leetcode精讲3.动态规划

搞定大厂算法面试之leetcode精讲4.贪心