Leetcode - 148双周赛

一、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[]{
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶祇秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值