连续几周掉分了
【自定义排序】按身高排序
题目
给你一个字符串数组 names
,和一个由 互不相同 的正整数组成的数组 heights
。两个数组的长度均为 n
。
对于每个下标 i
,names[i]
和 heights[i]
表示第 i
个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names
。
示例 1:
|
|
示例 2:
|
|
提示:
n == names.length == heights.length
1 <= n <= 10^3
1 <= names[i].length <= 20
1 <= heights[i] <= 10^5
names[i]
由大小写英文字母组成heights
中的所有值互不相同
解题思路
自定义排序
代码
|
|
【思维】按位与最大的最长子数组
题目
给你一个长度为 n
的整数数组 nums
。
考虑 nums
中进行 **按位与(bitwise AND)**运算得到的值 最大 的 非空 子数组。
- 换句话说,令
k
是nums
任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于k
的子数组。
返回满足要求的 最长 子数组的长度。
数组的按位与就是对数组中的所有数字进行按位与运算。
子数组 是数组中的一个连续元素序列。
示例 1:
|
|
示例 2:
|
|
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
解题思路
根据按位与运算的特性,有 a AND b <= min(a, b)。题目首先要求子数组按位与结果最大,然后求最长子数组。因此题目实际上求的是数组中的最大值最多连续出现了几次
代码
|
|
【DP/线段树】找到所有好下标
题目
给你一个大小为 n
下标从 0 开始的整数数组 nums
和一个正整数 k
。
对于 k <= i < n - k
之间的一个下标 i
,如果它满足以下条件,我们就称它为一个 好 下标:
- 下标
i
之前 的k
个元素是 非递增的 。 - 下标
i
之后 的k
个元素是 非递减的 。
按 升序 返回所有好下标。
示例 1:
|
|
示例 2:
|
|
提示:
n == nums.length
3 <= n <= 10^5
1 <= nums[i] <= 10^6
1 <= k <= n / 2
解题思路
思维钝化了,直接用线段树莽了,调了很长时间,还WA了一发
用线段树的话,可以维护每一个区间的单调性,额外记录对应区间的左右端点值即可
简单的想,其实用一维数组即可维护单调性情况
代码
DP
|
|
线段树
|
|
【并查集+离线】好路径的数目
题目
给你一棵 n
个节点的树(连通无向无环的图),节点编号从 0
到 n - 1
且恰好有 n - 1
条边。
给你一个长度为 n
下标从 0 开始的整数数组 vals
,分别表示每个节点的值。同时给你一个二维整数数组 edges
,其中 edges[i] = [ai, bi]
表示节点 ai
和 bi
之间有一条 无向 边。
一条 好路径 需要满足以下条件:
- 开始节点和结束节点的值 相同 。
- 开始节点和结束节点中间的所有节点值都 小于等于 开始节点的值(也就是说开始节点的值应该是路径上所有节点的最大值)。
请你返回不同好路径的数目。
注意,一条路径和它反向的路径算作 同一 路径。比方说, 0 -> 1
与 1 -> 0
视为同一条路径。单个节点也视为一条合法路径。
示例 1:
|
|
示例 2:
|
|
示例 3:
|
|
提示:
n == vals.length
1 <= n <= 3 * 104
0 <= vals[i] <= 105
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
ai != bi
edges
表示一棵合法的树。
解题思路
解法很有意思。化静为动。
考虑重新构造出这棵树,按节点值从小到大的顺序,期间利用并查集维护联通性,以及每个联通块所含最大值及相应数目
这样在构造过程中,使得每个联通块的代表元都是当前最大值,方便得出题目中所要求的“好路径”
详见注释
代码
|
|