leetcode contest 376
T4
竟然没有做出来,不过 T3
确实是个不错的题目,非常考验思考的能力。
100149. 找出缺失和重复的数字
给你一个下标从 0 开始的二维整数矩阵 grid
,大小为 n * n
,其中的值在 [1, n2]
范围内。除了 a
出现 两次,b
缺失 之外,每个整数都 恰好出现一次 。
任务是找出重复的数字a
和缺失的数字 b
。
返回一个下标从 0 开始、长度为 2
的整数数组 ans
,其中 ans[0]
等于 a
,ans[1]
等于 b
。
示例 1:
输入:grid = [[1,3],[2,2]] |
示例 2:
输入:grid = [[9,1,7],[8,9,2],[3,4,6]] |
提示:
2 <= n == grid.length == grid[i].length <= 50
1 <= grid[i][j] <= n * n
- 对于所有满足
1 <= x <= n * n
的x
,恰好存在一个x
与矩阵中的任何成员都不相等。 - 对于所有满足
1 <= x <= n * n
的x
,恰好存在一个x
与矩阵中的两个成员相等。 - 除上述的两个之外,对于所有满足
1 <= x <= n * n
的x
,都恰好存在一对i, j
满足0 <= i, j <= n - 1
且grid[i][j] == x
。
地址
https://leetcode.cn/contest/weekly-contest-376/problems/find-missing-and-repeated-values/
题意
模拟
思路
- 经典题目,找到一个出现一次和未出现的元素,直接模拟哈希统计就是非常简单的问题,当然还可以用异或之类的技巧解法。找到未出现的元素与出现两次的元素即可。
- 复杂度分析:
- 时间复杂度:$O(n^2)$,其中 $n$ 表示给定矩阵的行数。
- 空间复杂度:$O(n^2)$, 其中 $n$ 表示给定矩阵的行数。
代码
class Solution: |
100161. 划分数组并满足最大差限制
给你一个长度为 n
的整数数组 nums
,以及一个正整数 k
。
将这个数组划分为一个或多个长度为 3
的子数组,并满足以下条件:
nums
中的 每个 元素都必须 恰好 存在于某个子数组中。- 子数组中 任意 两个元素的差必须小于或等于
k
。
返回一个 二维数组 ,包含所有的子数组。如果不可能满足条件,就返回一个空数组。如果有多个答案,返回 任意一个 即可。
示例 1:
输入:nums = [1,3,4,8,7,9,3,5,1], k = 2 |
示例 2:
输入:nums = [1,3,3,2,7,3], k = 3 |
提示:
n == nums.length
1 <= n <= 105
n
是3
的倍数1 <= nums[i] <= 105
1 <= k <= 105
地址
题意
数学问题 + 贪心
思路
- 首先需要将数组排序,依次枚举,对第 $0$ 个元素,此时与 $nums[0]$ 最接近的两个元素即为 $nums[1],nums[2]$, 如果 $nums[1],nums[2]$ 与 $nums[0]$ 的差值都大于 $k$ ,则此时一定无法满足分类。然后再依次枚举 $nums[3]$, 相邻的三个元素是否可以构成合法分组。本质上是相邻的三个元素进行分组即可。
- 复杂度分析:
- 时间复杂度:$O(n \times \log n)$,其中 $n$ 表示给定数组的长度。
- 空间复杂度:$O(\log n)$。
代码
class Solution: |
100151. 使数组成为等数数组的最小代价
给你一个长度为 n
下标从 0 开始的整数数组 nums
。
你可以对 nums
执行特殊操作 任意次 (也可以 0 次)。每一次特殊操作中,你需要 按顺序 执行以下步骤:
- 从范围
[0, n - 1]
里选择一个下标i
和一个 正 整数x
。 - 将
|nums[i] - x|
添加到总代价里。 - 将
nums[i]
变为x
。
如果一个正整数正着读和反着读都相同,那么我们称这个数是 回文数 。比方说,121
,2552
和 65756
都是回文数,但是 24
,46
,235
都不是回文数。
如果一个数组中的所有元素都等于一个整数 y
,且 y
是一个小于 109
的 回文数 ,那么我们称这个数组是一个 等数数组 。
请你返回一个整数,表示执行任意次特殊操作后使 nums
成为 等数数组 的 最小 总代价。
示例 1:
输入:nums = [1,2,3,4,5] |
示例 2:
输入:nums = [10,12,13,14,15] |
示例 3 :
输入:nums = [22,33,22,33,22] |
提示:
1 <= n <= 105
1 <= nums[i] <= 109
地址
https://leetcode.cn/contest/weekly-contest-376/problems/minimum-cost-to-make-array-equalindromic/
题意
贪心 + 数学
思路
对于一个数组来说,我们知道数组的中位数到所有元素的距离之和最小,此时我们只需要找到距离中位数最近的回文数 $x$,此时 $x$ 到所有元素的差的绝对值之和最小。此时我们可以参考力扣经典题目 寻找最近的回文数,可以得到最近的回文数一定在下属序列中:
用原数的前半部分替换后半部分得到的回文整数。
用原数的前半部分加一后的结果替换后半部分得到的回文整数。
用原数的前半部分减一后的结果替换后半部分得到的回文整数。
为防止位数变化导致构造的回文整数错误,因此直接构造 $999999\dots 999 和 100\dots 001$ 作为备选答案。
找到备选的元素后,我们直接求最小的变换数目即可。
- 时间复杂度:$O(n)$,其中$n$ 表示给定数组的长度;
- 空间复杂度:$O(\log U)$,其中$u$ 表示给定数组中的最大元素;
代码
def getCandidates(x): |
100123. 执行操作使频率分数最大
显示英文描述
- 通过的用户数215
- 尝试过的用户数451
- 用户总通过次数248
- 用户总提交次数936
- 题目难度****Hard
给你一个下标从 0 开始的整数数组 nums
和一个整数 k
。
你可以对数组执行 至多 k
次操作:
- 从数组中选择一个下标
i
,将nums[i]
增加 或者 减少1
。
最终数组的频率分数定义为数组中众数的 频率 。
请你返回你可以得到的 最大 频率分数。
众数指的是数组中出现次数最多的数。一个元素的频率指的是数组中这个元素的出现次数。
示例 1:
输入:nums = [1,2,6,4], k = 3 |
示例 2:
输入:nums = [1,4,4,2,4], k = 0 |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
0 <= k <= 1014
地址
题意
滑动窗口
思路
- 首先需要将数组排序,我们知道对于任意的窗口 $[l,r]$ 此时窗口内的所有元素到窗口的中位数差的绝对值之和最小,此时我们可以采用滑动窗口 $l$ 只想窗口的左端,$r$ 指向窗口的右端,此时计算窗口内将所有元素变为其中位数所花费的代价是否大于 $k$:
- 如果窗口变为中位数的代价小于 $k$, 则表示该窗口符合要求,并记录当前窗口的大小;
- 如果窗口变为中位数的代价大于 $k$,则表示当前窗口无法满足要求,此时需要将窗口左端点向右移动;
- 题目本质即为求医 $r$ 为右端点的且满足代价小于 $k$ 的最大长度;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示数组的长度;
- 空间复杂度:$O(n)$,其中 $n$ 表示数组的长度;
代码
class Solution: |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章