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


    [LeetCode周赛复盘] 第 115 场双周赛20231014

      • 一、本周周赛总结
      • 100095. 上一个遍历的整数
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 100078. 最长相邻不相等子序列 I
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 100077. 最长相邻不相等子序列 II
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 100029. 和带限制的子多重集合的数目
        • 1. 题目描述
        • 2. 思路分析
        • 3. 代码实现
      • 参考链接

    一、本周周赛总结

    • T1 模拟。
    • T2 贪心。
    • T3 DP类似LIS,构造路径方案。
    • T4 分组前缀和优化的分组背包求方案数。
      在这里插入图片描述

    100095. 上一个遍历的整数

    100095. 上一个遍历的整数

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    按题意模拟即可。

    3. 代码实现

    class Solution:
        def lastVisitedIntegers(self, words: List[str]) -> List[int]:
            ans = []
            nums = []
            k=0
            for v in words:
                if v[0].isdigit():
                    nums.append(int(v))
                    k = 0 
                else:
                    k += 1 
                    if k > len(nums):
                        ans.append(-1)
                    else:
                        ans.append(nums[-k])
            return ans 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    100078. 最长相邻不相等子序列 I

    100078. 最长相邻不相等子序列 I

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    方法1
    
    • 1
    • 枚举第一个g是0还是1,然后贪心的向后取位置。

    方法2
    
    • 1
    • 直接pairwise,相邻不同了,则可以取左边的,注意记得取最后一个。

    3. 代码实现

    class Solution:
        def getWordsInLongestSubsequence(self, n: int, words: List[str], groups: List[int]) -> List[str]:
    
            def f(s):
                ans = [0,[]]
                for w, g in zip(words,groups):
                    if g == s:
                        ans[0]+=1
                        ans[1].append(w)
                        s ^= 1 
                return ans
           
            return max(f(0),f(1))[1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    100077. 最长相邻不相等子序列 II

    100077. 最长相邻不相等子序列 II

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    • n方dp。
    • 从前边满足的地方转移过来,注意记录一个from_index来储存路径。

    3. 代码实现

    def han(s, t):
        return sum(x!=y for x,y in zip(s,t))
    class Solution:
        def getWordsInLongestSubsequence(self, n: int, words: List[str], groups: List[int]) -> List[str]:
            f = [1]*n 
            from_index = [-1]*n
            for i, (w, g) in enumerate(zip(words,groups)):
                for j in range(i):
                    if g != groups[j] and len(w) == len(words[j]) and han(words[j], w) == 1 and f[j] >= f[i]:
                        f[i] = f[j] + 1
                        from_index[i] = j
            i = f.index(max(f))
            ans = []
            while i != -1:
                ans.append(words[i])
                i = from_index[i]
            return ans[::-1]                    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    100029. 和带限制的子多重集合的数目

    100029. 和带限制的子多重集合的数目

    1. 题目描述

    在这里插入图片描述

    2. 思路分析

    • 题目描述很复杂,但其实是分组背包求方案数。
    • 这样的话,值域是2e4,物品数也是2e4。n方会TLE。
    • 考虑优化,我们知道分组背包先遍历组,然后遍历体积,再遍历每组里的物品。
      • 可以看到内层,f[j] += f[j-k]+…f[j-k*c],这里累计了1~c,并且间隔是一样的,考虑用前缀和优化。
      • 可以用分组前缀和,类似滑窗。参考普通前缀和,我们向前边添加k个0,方便代码。
    • 注意到,题目限制sum(nums)<=2e4,那么不同的数字最多有多少组呢?显然最小是1,2,3~,那么不同数字组最多是开方级别的。
    • 因此复杂度变成了O(r√S)。

    3. 代码实现

    MOD = 10**9 + 7 
    class Solution:
        def countSubMultisets(self, nums: List[int], l: int, r: int) -> int:
            cnt = Counter(nums)
            f = [cnt[0]+1] + [0] * r
            s = 0
            for k, c in cnt.items():
                if k == 0:continue
                s += k * c 
                pre = [0]*k             
                for v in f:
                    pre.append((v+pre[-k])%MOD)
                for j in range(min(s, r), 0, -1):
                    # f[j] += f[j-k]+..f[j-k*c]
                    f[j] += pre[j] - pre[max(j-k*c, 0)]
                    f[j] %= MOD 
            return sum(f[l:]) %MOD   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    参考链接

  • 相关阅读:
    HJY-F931A/YJ三相电压继电器
    git submodule使用
    【单片机】LED模块和独立按键的使用
    唐先杰遇上区块链:要加薪,也要改变世界 | 对话MVP
    pymysql调用存储过程
    paddlenlp:社交网络中多模态虚假媒体内容核查(特征篇)
    Chapter12 : Deep Learning Applied to Ligand-Based De Novo Drug Design
    Kotlin 中let 、run 、with、apply、also的用法与区别
    leetcode86 分割链表
    java项目之见福便利店信息管理系统(ssm框架)
  • 原文地址:https://blog.csdn.net/liuliangcan/article/details/133845606
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号