一、3423. 循环数组中相邻元素的最大差值
题目链接
暴力枚举相邻的两个元素,代码如下:
class Solution {
public int maxAdjacentDistance(int[] nums) {
int ans = 0;
int n = nums.length;
for(int i=0; i<n; i++){
ans = Math.max(ans, Math.abs(nums[i]-nums[(i+1)%n]));
}
return ans;
}
}
二、3424. 将数组变相同的最小代价
题目链接
本题有两种情况:
- 不使用操作一,直接计算,答案为 s u m ( a b s ( a [ i ] − b [ i ] ) ) sum(abs(a[i] - b[i])) sum(abs(a[i]−b[i]))
- 使用操作一,将数组 a a a 其变为最佳的顺序,然后计算,答案为 s u m ( a b s ( a [ i ] − b [ i ] ) ) + k sum(abs(a[i]-b[i]))+k sum(abs(a[i]−b[i]))+k
- 取两者的较大值
这里的最佳顺序是, 最大的 a [ i ] − > 最大的 b [ i ] ,次大的 a [ i ] − > 次大的 b [ i ] 最大的a[i]->最大的b[i],次大的a[i]->次大的b[i] 最大的a[i]−>最大的b[i],次大的a[i]−>次大的b[i],以此类推,证明如下:
代码如下:
class Solution {
public long minCost(int[] arr, int[] brr, long k) {
long ans = count(arr, brr);
Arrays.sort(brr);
Arrays.sort(arr);
return Math.min(ans, count(arr, brr)+k);
}
long count(int[] a, int[] b){
long res = 0;
int n = a.length;
for(int i=0; i<n; i++){
res += (long)Math.abs(a[i]-b[i]);
}
return res;
}
}
三、3425. 最长特殊路径
题目链接
本题求从祖先节点到后代节点,且节点值互不相同的最长路径(路径相同时,求经过节点最少的数量),可以得到以下信息:
- 求的是一个路径,就不可能是一颗树,可以使用前缀和的思想来求一个区间的和(即路径长度),在树的概念里,可以使用树的高度 d e p t h depth depth(深度)来代替区间 [ l , r ] [l,r] [l,r]
- 题目还要求一个路径中不能出现节点值相同的节点,所以还需要用一个哈希表 m a p map map 来记录从根节点到叶子节点的每个路径中,距离当前节点最近的所有节点值所在的深度。
- 此时就可以边遍历边计算,得到以当前节点为终点的路径的最大值及其经过的节点个数,同时不断的更新答案。
代码如下:
class Solution {
public int[] longestSpecialPath(int[][] edges, int[] nums) {
int n = nums.length;
List<int[]>[] g = new ArrayList[n];
Arrays.setAll(g, e->new ArrayList<>());
for(int[] e : edges){
int v = e[0], w = e[1], wt = e[2];
g[v].add(new int[]{