码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [LeetCode周赛复盘] 第 312 场周赛20220925


    [LeetCode周赛复盘] 第 312 场周赛20220925

      • 一、本周周赛总结
      • 二、 [Easy] 6188. 按身高排序
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 三、[Medium] 6189. 按位与最大的最长子数组
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 四、[Medium] 6190. 找到所有好下标
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 五、[Hard] 6191. 好路径的数目
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 六、参考链接

    一、本周周赛总结

    • 20220927周二更新:麻蛋,T4被re了,没用乘法原理。

    • T4 wa2次TLE3次,难受。
    • 并查集要好好练!
      在这里插入图片描述

    二、 [Easy] 6188. 按身高排序

    链接: 6188. 按身高排序

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    定级Easy。
    按题意排序即可。

    3. 代码实现

    class Solution:
        def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:
            return [a for a,b in sorted(zip(names,heights),key=lambda x:-x[1])]
    

    三、[Medium] 6189. 按位与最大的最长子数组

    链接: 6189. 按位与最大的最长子数组

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    定级Medium。

    • 两个数与的话,一定不能使任意数变大
    • 两个数相同使数不变。
    • 因此数组最大与结果k一定是最大那个数
    • 因此求出k,然后找连续的k的最长区间即可。

    3. 代码实现

    class Solution:
        def longestSubarray(self, nums: List[int]) -> int:
            n  = len(nums)
            ans = 1
            mx = max(nums)
            
            f = [0]*n
            if nums[0] == mx:
                f[0] = 1
            for i in range(1,n):
                if nums[i] == mx:
                    f[i] = f[i-1]+1
            return max(f)
            
    

    四、[Medium] 6190. 找到所有好下标

    链接: 6190. 找到所有好下标

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    定级Medium。

    • dp
    • 用f和g记录每个位置i前边连续非增、非降的区间大小。
    • 然就检查题意区间[k,n-k)中所有下标两边的大小是否>=k即可。

    3. 代码实现

    class Solution:
        def goodIndices(self, nums: List[int], k: int) -> List[int]:
            n = len(nums)
            f = [1]*n
            g = [1]*n
            for i in range(1,n):
                if nums[i]<=nums[i-1]:
                    f[i]= f[i-1]+1
                if nums[i] >= nums[i-1]:
                    g[i] = g[i-1]+1
            ans = []
            for i in range(k,n-k):
                if f[i-1] >= k and g[i+k]>=k:
                    ans.append(i)
            return ans
    

    五、[Hard] 6191. 好路径的数目

    链接: 6191. 好路径的数目

    1. 题目描述

    在这里插入图片描述
    在这里插入图片描述

    2. 思路分析

    定级Hard。

    • 并查集。
    • 先建图g。
    • 然后把点离线,从小到大排序。
    • 然后从小到大访问点,建立并查集,注意建立并查集的时候,扫描这个点连接的边:
      • 只能连接不大于当前点u的邻居v。
      • 只能连接已访问过(已经在并查集里)的邻居v 。
    • 然后查询当前点所在集合中,相同值的数量,这里边一定都小于等于当前值,则有多少个点就有多少路径。
    • 当前集合相同值一定存在一条路径(因为是连通的)。
    • 由于是从小到大建树,因此路径中、集合中一定不存在比它大的值。
    • 注意,自己单点也算一条长度1的路径。

    3. 代码实现

    class Solution:
        def numberOfGoodPaths(self, vals: List[int], edges: List[List[int]]) -> int:
            p = vals[:]
            n = len(vals)
            f = [Counter([p[i]]) for i in range(n)]
            # print(f)
            fathers = list(range(n))
            def find_father(x):
                if fathers[x] != x:
                    fathers[x] = find_father(fathers[x])
                return fathers[x]
    
            def union(x, y, z):
                x = find_father(x)
                y = find_father(y)
                if x == y:
                    return 0
                fathers[x] = y
                a,b = f[y][z],f[x][z]
                f[y][z] += f[x][z]
                return a*b
    
            g = [[] for _ in range(n)]
            for u, v in edges:
                g[u].append(v)
                g[v].append(u)
    
            vals = sorted([(v, k) for k, v in enumerate(vals)])
            vis = set()
            ans = 0
            # print(vals)
            for i in range(n):
                v, k = vals[i]
                for x in g[k]:
                    if x in vis:
                        ans += union(k, x, v)
                ans += 1
                # x = find_father(k)
                # print(f[x][v])
                # ans += f[x][v]
                vis.add(k)
    
            # ans += n
            return ans                                   
    

    六、参考链接

    • [python刷题模板] 并查集
  • 相关阅读:
    本地快速让某个目录变成服务器访问
    【数据结构与算法】拓扑排序与关键路径
    NameNode的HA热备实现
    【mq】从零开始实现 mq-01-生产者、消费者启动
    【JAVASE开发】带你零基础学JAVA项目(学生管理系统篇)
    RabbitMq的最终一致性分布式事务
    【图像处理】小波编码图像中伪影和纹理的检测附Matlab代码和报告
    Swift 中的Getter 和 Setter
    scratch报时的公鸡 电子学会图形化编程scratch等级考试一级真题和答案解析2022年6月
    Python——流程控制
  • 原文地址:https://blog.csdn.net/liuliangcan/article/details/127036232
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号