leetcode biweekly contes 113
这次的双周赛题目还算不错,确实不太难的题目,比拼的还是手速场。
8039. 使数组成为递增数组的最少右移次数
给你一个长度为 n
下标从 0 开始的数组 nums
,数组中的元素为 互不相同 的正整数。请你返回让 nums
成为递增数组的 最少右移 次数,如果无法得到递增数组,返回 -1
。
一次 右移 指的是同时对所有下标进行操作,将下标为 i
的元素移动到下标 (i + 1) % n
处。
示例 1:
输入:nums = [3,4,5,1,2] |
示例 2:
输入:nums = [1,3,5] |
示例 3:
输入:nums = [2,1,4] |
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 100
nums
中的整数互不相同。
地址
https://leetcode.cn/contest/weekly-contest-363/problems/sum-of-values-at-indices-with-k-set-bits/
题意
直接模拟
思路
- 检测数组是否为循环递增数组,假设数组的长度为 $n$,即找到是否存在索引 $i$ 满足:
- $[0,i-1]$ 之间数组为递增,$[i,n-1]$ 之间数组递增,且满足 $nums[n-1] < nums[0]$;
- 是否满足将数组 $nums$ 循环移动 $x$ 位置后数组变为递增;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示数组的长度。
- 空间复杂度:$O(1)$。
代码
class Solution { |
2856. 删除数对后的最小数组长度
给你一个下标从 0 开始的 非递减 整数数组 nums
。
你可以执行以下操作任意次:
- 选择 两个 下标
i
和j
,满足i < j
且nums[i] < nums[j]
。 - 将
nums
中下标在i
和j
处的元素删除。剩余元素按照原来的顺序组成新的数组,下标也重新从 0 开始编号。
请你返回一个整数,表示执行以上操作任意次后(可以执行 0 次),nums
数组的 最小 数组长度。
示例 1:
输入:nums = [1,3,4,9] |
示例 2:
输入:nums = [2,3,6,9] |
示例 3:
输入:nums = [1,1,2] |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
nums
是 非递减 数组。
地址
https://leetcode.cn/contest/biweekly-contest-113/problems/minimum-array-length-after-pair-removals/
题意
数学题目
思路
- 最简单的做法每次选取频次最高的两个数进行配对,最后知道剩下的即可,另一种数学方法,假设当前数组的长度为 $n$,此时出现次数最多的元素为 $nums[i]$, 出现的次数为 $x$,
- 如果 $2x > n$, 即 $x$ 出现的次数超过数组的长度的一半,此时超出 $n -x$ 的部分无法配对,此时可以配对的次数为 $n - x$ 次, 剩余 $n - 2(n-x) = 2x - n$;
- 如果 $2x \le n$:
- 如果 $n$ 为偶数则一定可以完成配对;
- 如果 $n$ 为奇数则一定存在一个元素无法完成配对;
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为数组的长度。
- 空间复杂度:$O(n)$,其中 $n$ 为数组的长度。
代码
class Solution { |
6988. 统计距离为 k 的点对
给你一个 二维 整数数组 coordinates
和一个整数 k
,其中 coordinates[i] = [xi, yi]
是第 i
个点在二维平面里的坐标。
我们定义两个点 (x1, y1)
和 (x2, y2)
的 距离 为 (x1 XOR x2) + (y1 XOR y2)
,XOR
指的是按位异或运算。
请你返回满足 i < j
且点 i
和点 j
之间距离为 k
的点对数目。
示例 1:
输入:coordinates = [[1,2],[4,2],[1,3],[5,2]], k = 5 |
示例 2:
输入:coordinates = [[1,3],[1,3],[1,3],[1,3],[1,3]], k = 0 |
提示:
2 <= coordinates.length <= 50000
0 <= xi, yi <= 106
0 <= k <= 100
地址
https://leetcode.cn/contest/biweekly-contest-113/problems/count-pairs-of-points-with-distance-k/
题意
枚举
思路
题目初看起来貌似很难,但是关键在于 $k \in[0,100]$, $k$ 的取值范围非常小,所以导致题目就不是很难了。根据公式可以知道:
$$k = a \oplus x + b \oplus y$$,当然我们直接求 $a,b$ 比较困难,但是我们知道 $k= 100$,则此时假设 $a\oplus x = c$,则 $b \oplus y = 100 -c$,由于 $k$ 的范围非常小我们直接枚举 $c$ 的取值,则此时 $a = c \oplus x, b = y \oplus (100 - c)$, 此时我们即可知道另一个点的取值,此时我们利用哈希统计当前值为 $(a,b)$ 的点的数量,依次统计即可。
复杂度分析:
- 时间复杂度:$O(nk)$,其中 $n$ 表示数组的长度,$k$ 表示给定的元素;
- 空间复杂度:$O(n)$,其中 $n$ 表示数组的长度;
代码
class Solution { |
100041. 可以到达每一个节点的最少边反转次数
给你一个 n
个点的 简单有向图 (没有重复边的有向图),节点编号为 0
到 n - 1
。如果这些边是双向边,那么这个图形成一棵 树 。
给你一个整数 n
和一个 二维 整数数组 edges
,其中 edges[i] = [ui, vi]
表示从节点 ui
到节点 vi
有一条 有向边 。
边反转 指的是将一条边的方向反转,也就是说一条从节点 ui
到节点 vi
的边会变为一条从节点 vi
到节点 ui
的边。
对于范围 [0, n - 1]
中的每一个节点 i
,你的任务是分别 独立 计算 最少 需要多少次 边反转 ,从节点 i
出发经过 一系列有向边 ,可以到达所有的节点。
请你返回一个长度为 n
的整数数组 answer
,其中 answer[i]
表示从节点 i
出发,可以到达所有节点的 最少边反转 次数。
示例 1:
输入:n = 4, edges = [[2,0],[2,1],[1,3]] |
示例 2:
输入:n = 3, edges = [[1,2],[2,0]] |
提示:
2 <= n <= 105
edges.length == n - 1
edges[i].length == 2
0 <= ui == edges[i][0] < n
0 <= vi == edges[i][1] < n
ui != vi
- 输入保证如果边是双向边,可以得到一棵树。
地址
题意
换根 dp
思路
题目还是经典的题目变形,跟「834. 树中距离之和」基本类似的题目,
首先我们统计以 $0$ 点为根时需要反转的次数,这个就用简单的 $dfs$ 即可,即统计当前从孩子节点指向父亲节点的边的数目,总的数目为 $tot$;
其次我们从 $0$ 点开始依次遍历每个节点 $x$,此时我们只需要反装从 $0$ 到 $x$ 这条路径上的边即可,其余的边保证不再反转即可,
- 此时如果当前的边是孩子节点指向父亲节点的边,则此时反转的边的数目减 $1$, 即 $tot-1$;
- 此时如果当前的边是父亲节点指向孩子节点的边,则此时反转的边的数目加 $1$, 即 $tot+1$;
复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 表示节点的数目。
- 空间复杂度:$O(n)$,其中 $n$ 表示节点的数目。
代码
class Solution { |
欢迎关注和打赏,感谢支持!
- 关注我的博客: http://whistle-wind.com/
- 关注我的知乎:https://www.zhihu.com/people/da-hua-niu
- 关注我的微信公众号: 公务程序猿
扫描二维码,分享此文章