LeetCode:1402. 做菜顺序、2316. 统计无向图中无法互相到达点对数

news2024/11/24 15:56:52
1. 1402 做菜顺序

题目详细为:

一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。
一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。
返回厨师在准备了一定数量的菜肴后可以获得的最大 like-time 系数 总和。
你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。

示例为:

示例 1:
输入:satisfaction = [-1,-8,0,5,-9]
输出:14
解释:去掉第二道和最后一道菜,最大的 like-time 系数和为 (-11 + 02 + 53 = 14) 。每道菜都需要花费 1 单位时间完成。
示例 2:
输入:satisfaction = [4,3,2]
输出:20
解释:可以按照任意顺序做菜 (2
1 + 32 + 43 = 20)
示例 3:
输入:satisfaction = [-1,-4,-5]
输出:0
解释:大家都不喜欢这些菜,所以不做任何菜就可以获得最大的 like-time 系数。

提示:

n == satisfaction.length
1 <= n <= 500
-1000 <= satisfaction[i] <= 1000

难度:【困难

算法思路:
由于n的取值并没有很大,所以使用暴力解法解决这题完全没有问题,但是个人觉得可以这样来实现。
可以分为三类情况,(1)satisfaction这个数组(列表)中的最大数小于零,这样得到最终结果(按照上述公式)肯定小于0,那么直接返回0即可;(2)satisfaction这个数组(列表)中的最小数大于零,对这个数组进行升序排序,然后利用上述公式计算返回即可;(3)satisfaction这个数组(列表)中同时存在小于0和大于0的数,首先对这个数组进行升序排序,然后用一个变量根据上述公式计算对应结果num2,用变量num存储数组的和,之后再遍历这个数组,变量ans(初始值为0)返回最终结果,执行下述操作即可,ans = max(ans,num2),num2 -= num,num -= satisfaction[i],示意图如下:


satisfaction数组
排序前  [-1,-8,0,5,-9]
排序后 [-9,-8,-1,0,5]
num的值为:-13
num2的值为:-9 * 1 + -8 * 2 + -1 * 3 + 0 * 4 + 5 * 5 =  -3
ans = 0
遍历次数 ans num num2
1 0 -13 -3
2 0 -4 10
3 10 4 14
4 14 5 10
5 14 5 5

参考代码如下:

class Solution(object):
    def maxSatisfaction(self, satisfaction):
        """
        :type satisfaction: List[int]
        :rtype: int
        """
        satisfaction.sort()
        if satisfaction[-1] < 0:
            return 0

        ans = 0
        n = len(satisfaction)
        if satisfaction[0] > 0:
            start = 1
            for e in satisfaction:
                ans += start * e
                start += 1
        else:
            num = sum(satisfaction)
            num2 = 0
            for i in range(n):
                num2 += satisfaction[i] * (i+1)
            for i in range(n):
                ans = max(ans,num2)
                num2 -= num
                num -= satisfaction[i]

        return ans


a = Solution()
print(a.maxSatisfaction(satisfaction = [-1,-8,0,5,-9]))

运行结果:
请添加图片描述
虽然算法效率总体还不怎么的,但是比暴力肯定要好一些。

2. 2316. 统计无向图中无法互相到达点对数

题目详细为:

给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。
请你返回 无法互相到达 的不同 点对数目 。

示例为:

在这里插入图片描述
输入:n = 3, edges = [[0,1],[0,2],[1,2]]
输出:0
解释:所有点都能互相到达,意味着没有点对无法互相到达,所以我们返回 0 。
2.
在这里插入图片描述
输入:n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
输出:14
解释:总共有 14 个点对互相无法到达:
[[0,1],[0,3],[0,6],[1,2],[1,3],[1,4],[1,5],[2,3],[2,6],[3,4],[3,5],[3,6],[4,6],[5,6]]
所以我们返回 14 。

提示:

提示:
1 <= n <= 105
0 <= edges.length <= 2 * 105
edges[i].length == 2
0 <= ai, bi < n
ai != bi
不会有重复边。

算法思路:
从0号节点依次遍历到n-1号节点,如果遍历到某节点时,在map中已经存在了,那么不需要再进行接下来的操作,否则,在map中记录当前节点,然后依次遍历与该节点连通的节点,继续上述操作,直到遍历完某节点所有连通的节点,此时map中存储的节点个数减去pre(初始为0),即可得到一组不为0数,用一个数组arr存储,直到所有节点全部遍历完,然后计算arr中的数即可得到最终结果。但是有问题遍历arr需要两层,应该提交不了,为此直接在遍历节点的同时计算最终结果(但是最终还是差几个用例没有通过,最后参考官方代码改进才通过)。

参考代码为:

class Solution(object):
    def countPairs(self, n, edges):
        """
        :type n: int
        :type edges: List[List[int]]
        :rtype: int
        """
        map = {}
        for e in range(n):
            map[e] = []
        for key,value in edges:
            map[key].append(value)
            map[value].append(key)

        map2 = {}

        def dfs(cur_node):
            map2[cur_node] = 1
            arr = map[cur_node]
            count = 1
            for e in arr:
                if not map2.get(e,None):
                    count += dfs(e)
            return count

        ans = 0
        pre = 0
        for i in range(n):
            if not map2.get(i,None):
                count = dfs(i)
                ans += pre * count
                pre += count

        return ans

运行结果:
请添加图片描述

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

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

相关文章

外汇天眼:本周无牌裸奔平台名单出炉,你踩“坑”了么?!!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

Gartner发布2024 年十大战略技术趋势

10月17日&#xff0c;Gartner 发布2024年企业机构需要探索的****十大战略技术趋势。Gartner研究副总裁Bart Willemsen表示&#xff1a;“由于技术变革以及社会经济方面的不确定性&#xff0c;我们必须大胆采取行动并从战略上提高弹性&#xff0c;而不是采取临时措施。IT领导者的…

塔望3W消费战略全案丨九代拉祜人,一饼古树茶

存木香 客户&#xff1a;云南双江存木香茶叶商贸有限公司 品牌&#xff1a;存木香 时间&#xff1a;2019年 &#xff08;项目部分内容保密期&#xff09; 沧海桑田 存木香依然 存木香 CUNMUXIANG( 全称云南双江存木香茶业有限公司 ), 成立于2011 年 , 总部设于北回归线横…

小红书内测「群AI」功能;大模型技术图谱;曾鸣「看十年」智能商业演讲实录;GPT最佳实践-大白话编译版 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 小红书内测「群AI」功能&#xff0c;可以创建虚拟角色并加入群聊 小红书正在内测「群AI」新功能。日报根据站内分享贴拼出了一份教程&…

C++并发编程(1)-- 多线程的基础知识

1 进程、线程和协程 &#xff08;1&#xff09;进程 进程可以简单理解成正在执行的一个程序&#xff0c;比如你电脑上运行的QQ、360杀毒软件等就是进程。 进程是程序资源管理的最小单位。 进程会管理那些资源呢&#xff1f;通常包括内存资源、IO资源、信号处理等。 这里对…

众和策略:华为汽车概念活跃,圣龙股份斩获12板,华峰超纤涨10%

华为轿车概念23日盘中再度生动&#xff0c;到发稿&#xff0c;华峰超纤涨超10%&#xff0c;佛山照明、圣龙股份、隆基机械、银宝山新等涨停&#xff0c;赛力斯涨近6%。 值得注意的是&#xff0c;圣龙股份已接连12个交易日涨停。 昨日晚间&#xff0c;圣龙股份宣布前三季度成果…

Cisco交换机关于DHCP SNOOPING的配置指令

在Cisco交换机上配置DHCP Snooping&#xff08;DHCP欺骗防护&#xff09; DHCP Snooping的作用 DHCP Snooping是一项重要的网络安全功能&#xff0c;可用于维护网络的安全性和可靠性&#xff0c;减少潜在的网络问题&#xff0c;并提供日志和监控功能&#xff0c;以便网络管理…

【Servlet】实现Servlet程序

文章目录 1. 最朴素方式1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署程序7. 验证程序 2. 更方便方式1. 安装Smart TomCat插件2. 启动 1. 最朴素方式 1. 创建项目 选择Maven项目 2. 引入依赖 Maven项目创建完后会生成一个pom.xml文件&#xff0c;我们可…

rancher2.6.4配置管理k8s,docker安装

docker快速安装rancher并管理当前k8s集群。 1、拉镜像 docker pull rancher/rancher:v2.6.4 2、启动rancher 启动很慢 --privileged必须拥有root权限&#xff0c;并挂载卷 docker run --privileged -d --restartunless-stopped -p 80:80 -p 443:443 -v /usr/local/docker_vo…

rocketmq集群部署DLedger Controller

目录 rockermq集群部署DLedger Controller到官网下载rockermq集群模式&#xff1a;3切片主从建目录配置Nameserver先修改内存 启动NameServer停止NameServer配置Broker启动Broker启动管制台直接docker 启动即可&#xff0c;修改 -e 后面 nameserver 参数即可端口列表导入 rocke…

h5插件_h5页面嵌入客户端调试

当h5页面嵌入客户端之后&#xff0c;若是遇到问题无法调试&#xff0c;比如点击按钮无反应 —> 但是开发却看不到控制台、看不到接口返回值… 此时可以使用调试工具来查看… edura 引入1 <script src"https://cdn.jsdelivr.net/npm/eruda"></script&g…

向某文件中逐秒追加带序号输入当前时间 fgets fputs fprintf sprintf

//向某文件中逐秒追加带序号输入当前时间 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #include <unistd.h> int main(int argc, char const *argv[]) { time_t tv; // time(&tv);//法1:获取秒数 …

2023面试经典 Redis未授权漏洞与组合拳

文前漫谈 之前面试里碰见过&#xff0c;属于面试经典了&#xff0c;有空了了解一下 2015年的洞了&#xff0c;从以前乌云一个师傅的文章那了解到 Redis 有关的漏洞具有明显的时间分段性&#xff0c;在15年11月之前&#xff0c;主要是未授权导致的数据泄露&#xff0c;获得一些…

自增还是UUID,数据库主键的类型该如何选择?

一、自增(auto_increment)和UUID优缺点 自增 &#xff08;auto_increment&#xff09;的优点: 1.字段长度较uuid小很多&#xff0c;可以是bigint甚至是int类型&#xff0c;这对检索的性能会有所影响。 2.在写的方面&#xff0c;因为是自增的&#xff0c;所以主键是趋势自增的&…

小游戏外包开发流程及费用

小游戏的开发流程和费用会因项目的规模、复杂性和所选技术平台而有所不同。以下是一般的小游戏开发流程和可能的费用因素&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 开发流程&#xff1a; 概念和…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中&#xff0c;没有Assemble任务 1. 在编译aar包或者编译module的时候&#xff0c;没有release包&#xff0c;我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …

TransactionScope的使用

TransactionScope的使用 简介1. 命名空间2.创建事务范围3.嵌套事务4.事务提交和回滚5.支持分布式事务6.配置选项7.资源管理器8.分布式事务协调器 应用1.未设置分布式事务2.设置分布式事务 简介 TransactionScope 是 .NET Framework 和 .NET Core 中的一个类&#xff0c;用于简化…

Java数组—精讲篇

Java数组—精讲篇 先进行专栏介绍 二维数组定义格式初始化静态初始化动态初始化 举例声明并初始化一个3行4列的整型二维数组访问二维数组元素访问二维数组array中第2行第3列的元素 遍历二维数组遍历二维数组array并打印每个元素的值强调 应用举例总结 程序展示二维数组元素打乱…

ThingsBoard的版本控制整合gitee

1、注册gitee账号,创建自己的空间,并且创建一个用于存储ThingsBoard相关的仓库 2、进入ThingsBoard的租户层,然后找到版本控制,进行配置 输入gitee的仓库地址 仓库URL:指定你的gitee的参考地址 仓库分支:master 身份验证:密码、访问令牌 用户名:登录账号 密码/访问令…

【LeetCode刷题】1两数之和

为找工作&#xff0c;我的代码都是用的JAVA&#xff0c;慢慢学习中。 LeetCode刷题Day1 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入…