LeetCode 每日一题 2024/10/28-2024/11/3

news2024/11/6 10:40:54

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步


目录

      • 10/28 685. 冗余连接 II
      • 10/29 3211. 生成不含相邻零的二进制字符串
      • 10/30 3216. 交换后字典序最小的字符串
      • 10/31 3165. 不包含相邻元素的子序列的最大和
      • 11/1 3259. 超级饮料的最大强化能量
      • 11/2 3226. 使两个整数相等的位更改次数
      • 11/3638. 大礼包


10/28 685. 冗余连接 II

check用来检查是否满足
1.入度不能有大于1的
2.不能存在圈
先将所有点的父节点取出,如果存在有两个父节点 那么说明这个节点需要取出一条边 遍历后check是否正确
若正确 将结果暂存ret
判断ret,
若ret内有多个 则取出位置最靠后的作为结果
若ret==0:
所有节点入度都正常 说明存在圈 从后往前去除一个点 check是否正常 若正常则答案为这个点

def findRedundantDirectedConnection(edges):
    """
    :type edges: List[List[int]]
    :rtype: List[int]
    
    """
    def find(p,x):
        while p[x] != x:
            p[x] = p[p[x]]
            x = p[x]
        return p[x]
            # 判断给定的图是不是有圈
    def cycle(graph):
        p = {}
        for a, b in graph:
           
            p.setdefault(a, a)
            p.setdefault(b, b)
            pa, pb = find(p, a), find(p, b)
            print([a,b],p,pa,pb)
            if pa == pb: 
                return(True)
            else:
                p[pa] = p[pb]
    dic={}
    ans=[]
    ret =[]
    def check(l):
        #入度不能大于1
        endpoint = [y for x,y in l]
        if len(endpoint)!=len(set(endpoint)):
            return False

        def find(p,x):
            while p[x] != x:
                p[x] = p[p[x]]
                x = p[x]
            return p[x]

        # 判断给定的图是不是有圈
        def cycle(graph):
            p = {}
            for a, b in graph:
                p.setdefault(a, a)
                p.setdefault(b, b)
                pa, pb = find(p, a), find(p, b)
                if pa == pb: 
                    return(True)
                else:
                    p[pa] = p[pb]
                    
        if cycle(l):
            return False
            
        return True
    
    for v in edges:
        top = v[0]
        end = v[1]
        dic.setdefault(end,[])
        dic[end].append(top)
            
    for k in dic.keys():
        if len(dic[k])>1:
            for v in dic[k]:
                ori = edges[:]
                tmp=[v,k]
                ori.pop(ori.index(tmp))
                if check(ori):
                    ret.append(tmp)
    
    if len(ret)==0:
        for i in range(len(edges)-1,-1,-1):
            ori = edges[:]
            ori.pop(i)
            if check(ori):
                ans = edges[i]
                break
    else:
        pos = -1
        for i in ret:
            if edges.index(i)>pos:
                pos = edges.index(i)
                ans = i    
    
    return ans



10/29 3211. 生成不含相邻零的二进制字符串

所有长度为2的子字符串至少有一个1 说明不存在连续的两个0
将二进制按位取反为x 判断不存在连续两个1
如果x&(x>>1)=0 说明x没有连续的两个1

def validStrings(n):
    """
    :type n: int
    :rtype: List[str]
    """
    ans = []
    mask = (1<<n)-1
    for i in range(1<<n):
        t = mask^i
        if (t>>1 & t)==0:
            ans.append(f"{i:0{n}b}")
    return ans



10/30 3216. 交换后字典序最小的字符串

从前往后寻找
找到首次出现满足前面数字比后面大的就交换

def getSmallestString(s):
    """
    :type s: str
    :rtype: str
    """
    l=list(s)
    n=len(s)
    for i in range(n-1):
        if int(l[i])%2==int(l[i+1])%2 and l[i]>l[i+1]:
            l[i],l[i+1]=l[i+1],l[i]
            break
    return ''.join(l)



10/31 3165. 不包含相邻元素的子序列的最大和

将数组分为两段 每一段的首尾都有不选 或 可选两种情况
一共就有四种情况
00:首不选 尾不选
01:首不选 尾可选
10:首可选 尾不选
11:首可选 尾可选
将某数组x分为前后a,b两段 分别讨论四种情况
f(x)为x数组不相邻子序列最大和
f00(x) = max(f01(a)+f00(b),f00(a)+f10(b))
f01(x) = max(f00(a)+f11(b),f01(a)+f01(b))
f10(x) = max(f10(a)+f10(b),f11(a)+f00(b))
f11(x) = max(f10(a)+f11(b),f11(a)+f01(b))
用线段树来实现单点的修改 每个节点维护对应区间f(X)

def maximumSumSubsequence(nums, queries):
    """
    :type nums: List[int]
    :type queries: List[List[int]]
    :rtype: int
    """
    MOD=10**9+7
    n=len(nums)
    tr = [[0]*4 for _ in range(2<<n.bit_length())]
    
    def maxv(a,b):
        return b if b>a else a
    
    def merg(k):
        a,b = tr[k*2],tr[k*2+1]
        tr[k][0] = max(a[0]+b[2],a[1]+b[0])
        tr[k][1] = max(a[0]+b[3],a[1]+b[1])
        tr[k][2] = max(a[2]+b[2],a[3]+b[0])
        tr[k][3] = max(a[2]+b[3],a[3]+b[1])
    def build(k,l,r):
        if l==r:
            tr[k][3]=maxv(nums[l],0)
            return
        m=(l+r)//2
        build(k*2,l,m)
        build(k*2+1,m+1,r)
        merg(k)
    
    def change(k,l,r,i,val):
        if l==r:
            tr[k][3]=max(val,0)
            return
        m=(l+r)//2
        if i<=m:
            change(k*2,l,m,i,val)
        else:
            change(k*2+1,m+1,r,i,val)
        merg(k)
    
    build(1,0,n-1)
    ans = 0
    for i,val in queries:
        change(1,0,n-1,i,val)
        ans = (ans+tr[1][3])%MOD
    return ans



11/1 3259. 超级饮料的最大强化能量

动态规划 f[i][0/1]代表第i步喝A/B获得的最大值

def maxEnergyBoost(energyDrinkA, energyDrinkB):
    """
    :type energyDrinkA: List[int]
    :type energyDrinkB: List[int]
    :rtype: int
    """
    n=len(energyDrinkA)
    f = [[0,0] for _ in range(n+1)]
    for i in range(1,n+1):
        f[i][0] = f[i-1][0]+energyDrinkA[i-1]
        f[i][1] = f[i-1][1]+energyDrinkB[i-1]
        if i>1:
            f[i][0] = max(f[i][0],f[i-2][1]+energyDrinkA[i-1])
            f[i][1] = max(f[i][1],f[i-2][0]+energyDrinkB[i-1])
    return max(f[n][0],f[n][1])



11/2 3226. 使两个整数相等的位更改次数

按位判断

def minChanges(n, k):
    """
    :type n: int
    :type k: int
    :rtype: int
    """
    ans = 0
    while n>0 or k>0:
        if (n&1)==0 and (k&1)==1:
            return -1
        if (n&1)==1 and (k&1)==0:
            ans+=1
        n>>=1
        k>>=1
    return ans



11/3638. 大礼包

过滤掉不需要的套餐 保留有用套餐
dfs 遍历选取每一种套餐的情况
算出不买套餐的价格base
如果买套餐实惠则替换价格

def shoppingOffers(price, special, needs):
    """
    :type price: List[int]
    :type special: List[List[int]]
    :type needs: List[int]
    :rtype: int
    """
    n = len(price)
    
    fsp = []
    for sp in special:
        if sum(sp[i]*price[i] for i in range(n))>sp[n]:
            fsp.append(sp)
    
    def dfs(curneed):
        base = sum(curneed[i]*price[i] for i in range(n))
        for cursp in fsp:
            p = cursp[n]
            netneed = []
            for i in range(n):
                if cursp[i]>curneed[i]:
                    break
                netneed.append(curneed[i]-cursp[i])
            if len(netneed)==n:
                base = min(base,dfs(netneed)+p)
        return base
    return dfs(needs)



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(8.7_2)——败者树

多路平衡归并带来的问题 什么是败者树 败者树的构造 败者树的使用 败者树在多路平衡归并中的应用 败者树的实现思路 总结

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

Redis高级篇之缓存一致性详细教程

文章目录 0 前言1.缓存双写一致性的理解1.1 缓存按照操作来分 2. 数据库和缓存一致性的几种更新策略2.1 可以停机的情况2.2 我们讨论4种更新策略2.3 解决方案 总结 0 前言 缓存一致性问题在工作中绝对没办法回避的问题&#xff0c;比如&#xff1a;在实际开发过程中&#xff0c…

Vue2进阶之Vue3高级用法

Vue3高级用法 响应式Vue2&#xff1a;Object.definePropertyObject.definePropertythis.$set设置响应式 Vue3&#xff1a;Proxy composition APIVue2 option API和Vue3 compositionAPIreactive和shallowReactivereadonly效果toRefs效果 生命周期main.jsindex.htmlLifeCycle.vue…

Unity3D学习FPS游戏(10)子弹攻击敌人掉血(碰撞检测)

前言&#xff1a;前面最然创造出带有血条的敌人&#xff0c;但子弹打中敌人并没有效果。所以本篇将实现子弹攻击敌人&#xff0c;并让敌人掉血。 子弹攻击敌人掉血 整体思路目标补充知识-碰撞检测 准备工作刚体和碰撞器添加添加刚体后子弹代码优化补充知识-标签系统Tag添加 碰…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

问题 折磨的开始是天下苦黄狗久矣&#xff0c;为了不再被讨乞丐的显存恶心&#xff0c;一怒之下购入了AMD显卡&#xff08;20GB显存确实爽 头一天就跑了3dmark验机&#xff0c;完美通过&#xff0c;玩游戏也没毛病 但是呢这厮是一点不省心&#xff0c;玩游戏没问题&#xff0c…

服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角

摘要&#xff1a;本文以服装品牌零售业态融合为背景&#xff0c;探讨信息流优化和资金流创新的重要作用&#xff0c;并结合开源 AI 智能名片 S2B2C 商城小程序&#xff0c;分析其如何进一步推动服装品牌在零售领域的发展&#xff0c;提高运营效率和用户体验&#xff0c;实现商业…

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片&#xff08;Shard&#xff09;&#xff1a; 将索引数据分割成多个部分&#xff0c;每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理&#xff0c;从而提高系统的扩展性和性能。 在创建索…

语言模型的评测

语言模型的评测 内在评测 在内在评测中&#xff0c;测试文本通常由与预训练中所用的文本独立同分布的文本构成&#xff0c;不依赖于具体任务。最为常用的内部评测指标是困惑度&#xff08;Perplexity&#xff09; 困惑度是衡量语言模型对测试文本预测能力的一个指标&#xf…

Golang | Leetcode Golang题解之第535题TinyURL的加密与解密

题目&#xff1a; 题解&#xff1a; import "math/rand"type Codec map[int]stringfunc Constructor() Codec {return Codec{} }func (c Codec) encode(longUrl string) string {for {key : rand.Int()if c[key] "" {c[key] longUrlreturn "http:/…

德国卡赫携丰硕成果七赴进博会

第七届中国国际进口博览会于11月5日在国家会展中心&#xff08;上海&#xff09;正式拉开帷幕。作为全球最大的清洁设备和清洁解决方案提供商&#xff0c;“全勤生”德国卡赫连续七年参展&#xff0c;并携集团旗下子品牌HAWK霍克一同亮相技术装备展区3号馆&#xff0c;更带来多…

IT架构管理

目录 总则 IT架构管理目的 明确组织与职责 IT架构管理旨在桥接技术实施与业务需求之间的鸿沟&#xff0c;通过深入理解业务战略和技术能力&#xff0c;推动技术创新以支持业务增长&#xff0c;实现技术投资的最大价值。 设定目标与范围 IT架构管理的首要目的是确立清晰的组织…

Rust项目结构

文章目录 一、module模块1.文件内的module 二、模块化项目结构1.关于module2.各个模块之间互相引用 三、推荐项目结构1.实例 参考 一、module模块 1.文件内的module 关键字&#xff1a;mod 引入模块中的方法 usemod名字&#xff1a;方法名usemod名字.*写全路径 二、模块化…

HiveSQL 中判断字段是否包含某个值的方法

HiveSQL 中判断字段是否包含某个值的方法 在 HiveSQL 中&#xff0c;有时我们需要判断一个字段是否包含某个特定的值。下面将介绍几种常用的方法来实现这个功能。 一、创建示例表并插入数据 首先&#xff0c;我们创建一个名为employee的表&#xff0c;并插入一些示例数据&am…

408——计算机网络(持续更新)

文章目录 一、计算机网络概述1.1 计算机网络的概念1.2 计算机网络体系结构1.3 总结 二、物理层2.1 物理层的基本概念2.2 物理层的基本通信技术2.3 总结 三、数据链路层3.1 数据链路层基础概论3.2 数据链路层的通信协议 一、计算机网络概述 1.1 计算机网络的概念 计算机网络的定…

正反shell反弹的区分

在shell反弹中我们会根据参照物的不同来区分正反shell反弹。 本次我们需要使用win和kali进行实验&#xff1a; 在shell反弹中我们需要在win上面安装netcat&#xff08;瑞士军刀&#xff09;用于可以执行监听指令。 下载指导链接https://blog.csdn.net/qq_40359932/article/d…

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中&#xff0c;客户总是希望你的配色是美的&#xff0c;但是美如何定义&#xff…

Java 基于SpringBoot+Vue 的公交智能化系统,附源码、文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

qt QFile详解

1、概述 QFile类是Qt框架中用于读取和写入文本和二进制文件资源的I/O工具类。它继承自QFileDevice类&#xff0c;后者又继承自QIODevice类。QFile类提供了一个接口&#xff0c;允许开发者以二进制模式或文本模式对文件进行读写操作。默认情况下&#xff0c;QFile假定文件内容为…

react jsx基本语法,脚手架,父子传参,refs等详解

1&#xff0c;简介 1.1 概念 react是一个渲染html界面的一个js库&#xff0c;类似于vue&#xff0c;但是更加灵活&#xff0c;写法也比较像原生js&#xff0c;之前我们写出一个完成的是分为html&#xff0c;js&#xff0c;css&#xff0c;现在我们使用react库我们把html和js结…