Processing math: 100%

【LeetCode周赛】第191场周赛

一、5424. 数组中两元素的最大乘积

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

示例:

输入:nums = [3,4,5,2]
输出:12
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1)(5-1) = 3*4 = 12 。

输入:nums = [1,5,4,5]
输出:16
解释:选择下标 i=1 和 j=3(下标从 0 开始),则可以获得最大值 (5-1)*(5-1) = 16 。

输入:nums = [3,7]
输出:12

提示:

  • 2 <= nums.length <= 500
  • 1 <= nums[i] <= 10^3

分析:

​ 由于题目给定了数组中元素皆为正数,所以只需要选出数组中最大与次大的元素即可。可以用排序来找出这两个元素,但是需要O(nlgn)的时间复杂度。因此我们用一次遍历来找出这两个数,只需要O(n)时间复杂度就可以解决问题。

代码:

class Solution:
def maxProduct(self, nums: List[int]) -> int:
fir_max, sec_max = 0, 0
# 一次遍历找出最大值与次大值
for num in nums:
if num >= fir_max:
sec_max = fir_max
fir_max = num
if sec_max <= num < fir_max:
sec_max = num
return (fir_max - 1) * (sec_max - 1)

二、5425. 切割后面积最大的蛋糕

矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts,其中 horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离,类似地, verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离。

请你按数组 horizontalCuts 和 verticalCuts 中提供的水平和竖直位置切割后,请你找出 面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果对 10^9 + 7 取余后返回。

示例:

输入:h = 5, w = 4, horizontalCuts = [1,2,4], verticalCuts = [1,3]
输出:4

输入:h = 5, w = 4, horizontalCuts = [3,1], verticalCuts = [1]
输出:6

输入:h = 5, w = 4, horizontalCuts = [3], verticalCuts = [3]
输出:9

分析:

​ 切割后面积最大的蛋糕,它的垂直与水平方向上的区间间隔的乘积一定是最大的。并且我们可以得出,垂直与水平方向上的区间分隔分别最大。这样只需要找到这两个最大区间分隔,返回它们的乘积即可。

代码:

class Solution:
def maxArea(self, h: int, w: int, horizontalCuts: List[int], verticalCuts: List[int]) -> int:
horizontalCuts = [0] + sorted(horizontalCuts) + [h]
verticalCuts = [0] + sorted(verticalCuts) + [w]
max_hon, max_vert = 0, 0
for i in range(1, len(horizontalCuts)):
max_hon = max(max_hon, horizontalCuts[i] - horizontalCuts[i - 1])
for i in range(1, len(verticalCuts)):
max_vert = max(max_vert, verticalCuts[i] - verticalCuts[i - 1])
# 由于答案可能是一个很大的数字,因此需要将结果对 10^9 + 7 取余后返回。
return (max_hon * max_vert) % 1000000007

三、5426. 重新规划路线

n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以改变交通拥堵的状况。

路线用 connections 表示,其中 connections[i] = [a, b] 表示从城市 a 到 b 的一条有向路线。

今年,城市 0 将会举办一场大型比赛,很多游客都想前往城市 0 。

请你帮助重新规划路线方向,使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。

题目数据 保证 每个城市在重新规划路线方向后都能到达城市 0 。

示例:

输入:n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
输出:3

输入:n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
输出:2

输入:n = 3, connections = [[1,0],[2,0]]
输出:0

分析:

​ 题目中所指的重新规划路线,其实只有更换方向这一种操作而已。并且题目保证每个城市在重新规划路线方向后都能达到城市0。因此我们可以认为,图中的结点实际上只有两种状态,一种是可以到达0,一种是经过一次翻转后可以到达0(即指向0或指向0的结点)。因此可以定义两个集合保存两个状态 connectedreversed。connected记录指向0的结点,reversed记录一次翻转就可以指向0的结点。遍历完成后,connected的长度应该与n相等,这样就符合题目要求:所有城市都可以访问城市0,reversed的长度就是本题答案。

代码:

class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
res = 0
connected = set() # 记录已联通的结点
connected.add(0)
reversed = set() # 记录只需要一次翻转就可以联通的结点,最后得到的长度就是题目答案
while len(connected) < n:
for city in connections:
# 判断是否可以到达0
if city[1] in connected:
connected.add(city[0])
for city in connections:
# 判断是否可以通过翻转来到达0
if city[0] in connected and city[1] not in connected:
reversed.add(city[1])
for i in reversed:
connected.add(i)
return len(reversed)

总结:

​ t4并没有做出来,这里只有链接,看看别人的题解:5427. 两个盒子中球的颜色数相同的概率

posted @   macguz  阅读(156)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示