Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并

这篇具有很好参考价值的文章主要介绍了Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

208.实现Trie

题目链接:https://leetcode.com/problems/implement-trie-prefix-tree

解法:

这个题非常经典,背下来。

首先需要自己实现Node的类,属性为children和是否为单词的标记,再去初始化Trie的类。

在插入和查询的过程中,都要不断让指针指向children。

参考题解:实现Trie

边界条件:无

Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并,数据结构和算法,算法,数据结构,leetcode

class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_word = False

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word: str) -> None:
        node = self.root
        for c in word:
            if c not in node.children:
                node.children[c] = TrieNode()
            node = node.children[c]
        node.is_word = True

    def search_prefix(self, word):
        node = self.root
        for c in word:
            if c not in node.children:
                return None
            node = node.children[c]
        return node

    def search(self, word: str) -> bool:
        node = self.search_prefix(word)
        return node is not None and node.is_word

    def startsWith(self, prefix: str) -> bool:
        node = self.search_prefix(prefix)
        return node is not None


# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

54.螺旋矩阵

题目链接:https://leetcode.com/problems/spiral-matrix

解法:

顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。代码实现就是去模拟这个过程。

思路很直观,但是要处理好最后(最内部)的一个元素、一行或者一列,还是比较有讲究。如果循环时的边界处理不当,那么最内部的元素、一行或一列可能需要单独处理,这样就麻烦了。

按照以下的遍历顺序去处理,注意到从左到右和其他的三个方向不一样,从左到右把一行的所有元素都遍历了,而其他方向的遍历则少一个元素。这样却比较好处理最后的元素。

把代码运行一遍就理解了。

Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并,数据结构和算法,算法,数据结构,leetcode

参考题解:螺旋矩阵

边界条件:

时间复杂度:O(mn),其中 m和 n分别是输入矩阵的行数和列数

空间复杂度:O(1)

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix: return []
        l, r, t, b = 0, len(matrix[0])-1, 0, len(matrix)-1
        res = []
        while True:
            for i in range(l, r+1):
                res.append(matrix[t][i])
                # t要马上加1,因为下面的遍历是从下一行开始的
            t += 1
            if t > b: break

            for i in range(t, b+1):
                res.append(matrix[i][r])
            r -= 1
            if l > r: break

            for i in range(r, l-1, -1):
                res.append(matrix[b][i])
            b -= 1
            if t > b:break

            for i in range(b, t-1, -1):
                res.append(matrix[i][l])
            l += 1
            if l > r:
                break

        return res

721.账户合并

题目链接:https://leetcode.com/problems/accounts-merge

解法:

并查集基础:图论——并查集(详细版)_哔哩哔哩_bilibili

并查集的代码是作为模板直接用的,有三个部分:初始化,查找父节点(寻根),合并。功能一般是用于查询两个节点是不是有相同的根(相同的集合中)。

一个容易理解的例子是:给出若干个pair对(张三和张五,李四和李六),pair对表示这俩人是亲戚关系,那么可以构建亲戚图谱(合并操作)。再给出一个pair对(张三和李六),问他们俩是不是亲戚(查询是否有相同的根)。

对于并查集的优化有路径压缩和按秩合并。路径压缩实现简单,这里只用了路径压缩。

具体实现直接看代码比较直观。

参考题解:并查集

边界条件:

时间复杂度:O(nlogn),其中 n是不同邮箱地址的数量,logn 是路径压缩的复杂度。另外对邮箱排序的复杂度也是O(nlogn)

空间复杂度:O(n)文章来源地址https://www.toymoban.com/news/detail-808128.html

class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))

    def find(self, idx):
        # 查找idx的根节点
        if self.parent[idx] != idx:
            self.parent[idx] = self.find(self.parent[idx])
        return self.parent[idx]

    def union(self, idx1, idx2):
        # 找到idx1和idx2的根节点,然后合并
        root1 = self.find(idx1)
        root2 = self.find(idx2)
        self.parent[root1] = root2

class Solution:
    def accountsMerge(self, accounts: List[List[str]]) -> List[List[str]]:
        email_index = {}
        email_name = {}

        # 把email转化为idx,以便直接使用并查集的模板
        for account in accounts:
            name = account[0]
            for email in account[1:]:
                if email not in email_index:
                    email_index[email] = len(email_index)
                    email_name[email] = name

        # 使用并查集合并邮箱
        uf = UnionFind(len(email_index))
        for account in accounts:
            first_idx = email_index[account[1]]
            for email in account[2:]:
                next_idx = email_index[email]
                uf.union(first_idx, next_idx)
            
        # 把作为根节点的邮箱所连接的所有邮箱收集起来(包含本身)
        idx_emails = defaultdict(list)
        for email, idx in email_index.items():
            root = uf.find(idx)
            idx_emails[root].append(email)

        # 添加name,获取结果
        res = []
        for emails in idx_emails.values():
            res.append([email_name[emails[0]]] + sorted(emails))
        return res

到了这里,关于Grind75第13天 | 208.实现Trie、54.螺旋矩阵、721.账户合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ( “树” 之 Trie) 208. 实现 Trie (前缀树) ——【Leetcode每日一题】

    知识点回顾 : Trie ,又称 前缀树 或 字典树 ,用于判断字符串是否存在或者是否具有某种字符串前缀。 难度:中等 Trie (发音类似 “ try ”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补

    2024年02月01日
    浏览(41)
  • LeetCode刷题系列 -- 54. 螺旋矩阵

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入: matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 提示: m == matrix.length n == matrix[i].length 1 =

    2023年04月08日
    浏览(61)
  • 力扣题解(54. 螺旋矩阵),带注释

    链接:点我

    2024年02月09日
    浏览(37)
  • 【图论】Leetcode 208. 实现 Trie (前缀树)【中等】

    Trie (发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean

    2024年04月16日
    浏览(58)
  • 【LeetCode-中等题】208. 实现 Trie (前缀树)

    插入图示: 全搜索和前缀搜索: 注意:全局匹配匹配完直接返回插入时的标志位 而前缀匹配时,匹配成功后直接返回true 因为不需要往下匹配了 匹配到空trie都统统直接返回false 相比较上面的用数组构建26叉树,其实也可以采用哈希表存储子节点 参考:Leetcode 208 实现Trie(前缀

    2024年02月09日
    浏览(47)
  • 算法leetcode|54. 螺旋矩阵(rust重拳出击)

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 m == matrix.length n == matrix[i].length 1 = m, n = 10 -100 = matrix[i][j] = 100 面对这道算法题目,二当家的再次陷入了沉思。 可以每次循环移动一步,判断移到边界就变换方向,巧用数组可以减少逻辑判断

    2024年02月08日
    浏览(48)
  • leetcode做题笔记208. 实现 Trie (前缀树)

    Trie (发音类似 \\\"try\\\")或者说  前缀树  是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie()  初始化前缀树对象。 void insert(String word)  向前缀树中插入字符串  word  。

    2024年02月07日
    浏览(44)
  • 剑指 Offer 29. 顺时针打印矩阵 / LeetCode 54. 螺旋矩阵(模拟)

    链接:剑指 Offer 29. 顺时针打印矩阵;LeetCode 54. 螺旋矩阵 难度:中等 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:

    2024年02月15日
    浏览(43)
  • 【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59-54

    欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来螺旋矩阵的分享 ✨ 给你一个正整数 n ,生成一个包含 1 到 n 2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 示例 2: 提示: 思路: 本类型题目其实都不涉及什么算法,就是模拟

    2024年02月16日
    浏览(46)
  • LeetCode、208. 实现 Trie (前缀树)【中等,自定义数据结构】

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年02月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包