LeetCode笔记:Biweekly Contest 110

news/2024/11/8 3:08:41/
  • LeetCode笔记:Biweekly Contest 110
    • 1. 题目一
      • 1. 解题思路
      • 2. 代码实现
    • 2. 题目二
      • 1. 解题思路
      • 2. 代码实现
    • 3. 题目三
      • 1. 解题思路
      • 2. 代码实现
    • 4. 题目四
      • 1. 解题思路
      • 2. 代码实现
  • 比赛链接:https://leetcode.com/contest/biweekly-contest-110

1. 题目一

给出题目一的试题链接如下:

  • 2806. Account Balance After Rounded Purchase

1. 解题思路

这一题思路上还是很直接的,就是首先找到给出的数的上下两个10的整倍数,然后找到其中满足题意得那一个,然后求一下和100的差即可。

2. 代码实现

给出python代码实现如下:

class Solution:def accountBalanceAfterPurchase(self, purchaseAmount: int) -> int:a = (purchaseAmount // 10) * 10b = a + 10roundedAmount = a if abs(a-purchaseAmount) < abs(b-purchaseAmount) else breturn 100 - roundedAmount

提交代码评测得到:耗时44ms,占用内存16.2MB。

2. 题目二

给出题目二的试题链接如下:

  • 2807. Insert Greatest Common Divisors in Linked List

1. 解题思路

这道题原意肯定是考链表,不过这里我偷了个机,直接先转成了array然后进行在恢复成链表,就省去了很多麻烦。

而剩下的就是求一下最大公约数,就不是啥大事了,用python自带的函数即可,当然自己实现也不复杂,就不赘述了。

2. 代码实现

给出python代码实现如下:

class Solution:def insertGreatestCommonDivisors(self, head: Optional[ListNode]) -> Optional[ListNode]:nodes = []while head:nodes.append(head.val)head = head.nextn = len(nodes)for i in range(n-1):a = nodes[2*i]b = nodes[2*i+1]nodes.insert(2*i+1, gcd(a,b))nodes = [ListNode(val) for val in nodes]n = len(nodes)for i in range(n-1):nodes[i].next = nodes[i+1]return nodes[0]

提交代码评测得到:耗时123ms,占用内存21.5MB。

3. 题目三

给出题目三的试题链接如下:

  • 2808. Minimum Seconds to Equalize a Circular Array

1. 解题思路

这一题其实想清楚之后还是挺简单的,因为其实最终肯定是要全部变成某一个具体的元素,因此,而要变成某一个元素,其所需的时间事实上就是其他元素到其最近的距离的最大值。

而要求这个值,事实上也就是任意两个相邻的相同同元素之间距离的一半。

因此,我们只需要记录一下每一个元素出现的所有位置,然后对每一个元素计算一下全部变成该元素所需的时间,然后取出最小值即可。

2. 代码实现

给出python代码实现如下:

class Solution:def minimumSeconds(self, nums: List[int]) -> int:n = len(nums)locs = defaultdict(list)for i, x in enumerate(nums):locs[x].append(i)def get_seconds(indexs):m = len(indexs)if m == 1:return n // 2dis = [(indexs[i] - indexs[i-1] + n) % n // 2 for i in range(m)]return max(dis)seconds = [get_seconds(indexs) for indexs in locs.values()]return min(seconds)

提交代码评测得到:耗时640ms,占用内存49.1MB。

4. 题目四

给出题目四的试题链接如下:

  • 2809. Minimum Time to Make Array Sum At Most x

1. 解题思路

这一题很可惜没能搞定,只是抄了大佬的答案……

思路来说倒是不难理解,或者说多少我也想到了,但是关键部分这样实现为什么可以work就多少有点不太理解了,这里就只是把大佬的思路先写下来,后来有空再回来看看吧……

整体的思路上来说其实还是挺简单的,显然,假设两个数组的和分别为 s 1 , s 2 s_1, s_2 s1,s2,那么如果经过 k k k次操作,其最终的答案一定是:

f ( k ) = s 1 + k ⋅ s 2 − ∑ i = 1 k ( a n i + k ⋅ b n i ) f(k) = s_1 + k \cdot s_2 - \sum\limits_{i=1}^{k} (a_{n_i} + k \cdot {b_{n_i}}) f(k)=s1+ks2i=1k(ani+kbni)

然后,这里的变量其实就是后面的 ∑ i = 1 k ( a n i + k ⋅ b n i ) \sum\limits_{i=1}^{k} (a_{n_i} + k \cdot {b_{n_i}}) i=1k(ani+kbni)部分,要使得整体的 f ( k ) f(k) f(k)最小,就是令 ∑ i = 1 k ( a n i + k ⋅ b n i ) \sum\limits_{i=1}^{k} (a_{n_i} + k \cdot {b_{n_i}}) i=1k(ani+kbni)取最大。其中, n i n_i ni是一组坐标的下标选择。

但是,我自己的话就是卡在这里做不下去了,不知道怎么去做这个问题,然后看大佬们的答案倒是思路也简单,就是在这里用了动态规划,定义 f n ( k ) \mathop{f_n}(k) fn(k)表示经过 k k k次操作之后能够获得的 ∑ i = 1 k ( a n i + k ⋅ b n i ) \sum\limits_{i=1}^{k} (a_{n_i} + k \cdot {b_{n_i}}) i=1k(ani+kbni)的最大值,然后动态规划的求取这个 f n ( k ) \mathop{f_n}(k) fn(k)

但是,就是关于这里为什么大佬们给出的动态规划方式可以work多少有点感觉奇怪,其实现上很简单:

  1. 首先对于位置关于 ( b i , a i ) (b_i, a_i) (bi,ai)的大小进行排序;

  2. 然后从小到大分别取出每一组 ( b i , a i ) (b_i, a_i) (bi,ai),依次更新所有的 f n ( k ) \mathop{f_n}(k) fn(k)为:

    f n ( k ) = m a x ( f n ( k ) , f n ( k − 1 ) + a i + k ⋅ b i ) \mathop{f_n}(k) = \mathop{max}(\mathop{f_n}(k), \mathop{f_n}(k-1) + a_i + k\cdot b_i) fn(k)=max(fn(k),fn(k1)+ai+kbi)

这个递推表达式本身也不难理解,就是对每一个元素,考察是否要取用这个元素作为第 k k k个被取用的元素,但是数学上为什么这样就一定能够获得最终的最优答案,多少还是有点想不太清楚,唉……

2. 代码实现

给出python代码实现如下:

class Solution:def minimumTime(self, nums1: List[int], nums2: List[int], x: int) -> int:n = len(nums1)nums = sorted([(b, a) for a, b in zip(nums1, nums2)])fn = [0 for _ in range(n+1)]for b, a in nums:for i in range(n, 0, -1):fn[i] = max(fn[i], fn[i-1] + a+i*b)s1 = sum(nums1)s2 = sum(nums2)for i in range(n+1):if s1 + s2*i - fn[i] <= x:return ireturn -1

提交代码评测得到:耗时1812ms,占用内存16.8MB。


http://www.ppmy.cn/news/1010060.html

相关文章

特殊符号的制作 台风 示例 使用第三方工具 Photoshop 地理信息系统空间分析实验教程 第三版

特殊符号的制作 首先这是一个含有字符的&#xff0c;使用arcgis自带的符号编辑器制作比较困难。所以我们准备采用Adobe Photoshop 来进行制作符号&#xff0c;然后直接导入符号的图片文件作为符号 我们打开ps&#xff0c;根据上面的图片的像素长宽比&#xff0c;设定合适的高度…

centos7 yum源安装出错及更新问题

如下 首先&#xff0c;在搜索jdk时报错如下&#xff1a; 解决办法 1、进入 yum的repo目录 cd /etc/yum.repos.d/2、修改所有的CentOS文件内容 sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-*sed -i s|#baseurlhttp://mirror.centos.org|baseurlhttp://vau…

Debian如何让multilib和交叉编译工具链共存

Debian一个槽点是gcc/g/gfortran-multilib和交叉编译工具链如gcc/g/gfortran-riscv64-linux-gnu会互相卸载&#xff0c;解决办法如下&#xff1a; 1、安装build-essential&#xff08;gcc/g/libc6-dev/make/dpkg-dev&#xff09;和gfortran&#xff0c;记下被安装的gcc版本&am…

解决Map修改key的问题

需求 现在返回json数据带有分页的数据&#xff0c;将返回data属性数据变更为content&#xff0c;数据不变&#xff0c;key发生变化 实现1&#xff0c;源数据比较复杂&#xff0c;组装数据比较麻烦 说明&#xff1a;如果使用这种方式完成需求&#xff0c;需要创建对象&#xff0…

Vue3 条件渲染简单应用

去官网学习-》条件渲染 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 条件渲染</h1><h2 v-if"flag">true显示内容</h2><h2 v-if"flag2">fal…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket数据包

1.简介 本来打算再写一篇这个系列的文章也要和小伙伴或者童鞋们说再见了&#xff0c;可是有人留言问WebSocket包和小程序的包不会抓&#xff0c;那就关于这两个知识点宏哥就再水两篇文章。 2.什么是Socket&#xff1f; 在计算机通信领域&#xff0c;socket 被翻译为“套接字…

JavaScript |(七)BOM及JSON简介 | 轮播图 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 系列笔记&#xff1a; JavaScript |&#xff08;一&#xff09;JavaScript简介及基本语法JavaScript |&#xff08;二&#xff09;JavaScript自定义对象及函数JavaScript |&#xff08;三&#xff…

P1833 樱花(多重背包)(内附封面)

樱花 题目背景 《爱与愁的故事第四弹plant》第一章。 题目描述 爱与愁大神后院里种了 n n n 棵樱花树&#xff0c;每棵都有美学值 C i ( 0 ≤ C i ≤ 200 ) C_i(0 \le C_i \le 200) Ci​(0≤Ci​≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸&#…