【力扣周赛】第 369 场周赛(⭐记忆化搜索 树形DP)

文章目录

  • 竞赛链接
  • Q1:2917. 找出数组中的 K-or 值
    • 竞赛时代码——按题意模拟
  • Q2:2918. 数组的最小相等和
    • 竞赛时代码——分类讨论
  • Q3:2919. 使数组变美的最小增量运算数⭐⭐⭐
    • 竞赛时代码——动态规划
    • 解法2——记忆化搜索 翻译成递推
  • Q4:2920. 收集所有金币可获得的最大积分⭐⭐⭐⭐⭐🐂
    • 解法1——自顶向下(记忆化搜索)
    • 解法2——自底向上
  • 成绩记录

竞赛链接

https://leetcode.cn/contest/weekly-contest-369/

Q1:2917. 找出数组中的 K-or 值

https://leetcode.cn/problems/find-the-k-or-of-an-array/description/

在这里插入图片描述

提示:
1 <= nums.length <= 50
0 <= nums[i] < 2^31
1 <= k <= nums.length

竞赛时代码——按题意模拟

class Solution {
    public int findKOr(int[] nums, int k) {
        int ans = 0;
        for (int i = 0; i < 31; ++i) {
            int c = 0;
            for (int x: nums) {
                if ((x >> i & 1) == 1) c++;
            }
            if (c >= k) ans |= 1 << i;
        }
        return ans;
    }
}

Q2:2918. 数组的最小相等和

https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/description/

在这里插入图片描述

提示:
1 <= nums1.length, nums2.length <= 10^5
0 <= nums1[i], nums2[i] <= 10^6

竞赛时代码——分类讨论

在这里插入图片描述

class Solution {
    public long minSum(int[] nums1, int[] nums2) {
        long s1 = 0, s2 = 0;
        int cnt1 = 0, cnt2 = 0;
        for (int x: nums1) {
            s1 += x;
            if (x == 0) cnt1++;
        }
        for (int x: nums2) {
            s2 += x;
            if (x == 0) cnt2++;
        }
        if (s1 < s2 + cnt2 && cnt1 == 0) return -1;
        if (s1 + cnt1 > s2 && cnt2 == 0) return -1;
        return Math.max(s1 + cnt1, s2 + cnt2);
    }
}

Q3:2919. 使数组变美的最小增量运算数⭐⭐⭐

https://leetcode.cn/problems/minimum-increment-operations-to-make-array-beautiful/description/

在这里插入图片描述

提示:
3 <= n == nums.length <= 10^5
0 <= nums[i] <= 10^9
0 <= k <= 10^9

竞赛时代码——动态规划

写的有点丑陋,但好歹是过了。

class Solution {
    public long minIncrementOperations(int[] nums, int k) {
        int n = nums.length;
        long[][] dp = new long[n + 1][2];       // dp[i][j]表示到第i个位置,选或不选且满足条件时的最小增量
        for (int i = 0; i <= n; ++i) Arrays.fill(dp[i], Long.MAX_VALUE);
        dp[0][0] = 0;
        dp[1][1] = Math.max(0, k - nums[0]);
        for (int i = 1; i <= n; ++i) {
            long x = nums[i - 1];
            if (i - 1 >= 0) {       // 前一个
                dp[i][0] = Math.min(dp[i][0], dp[i - 1][1]);
                dp[i][1] = Math.min(dp[i][1], Math.min(dp[i - 1][0], dp[i - 1][1]) + Math.max(0, k - x));
            }
            if (i - 2 >= 0) {       // 前两个
                dp[i][0] = Math.min(dp[i][0], dp[i - 2][1]);
                if (i - 3 >= 0) dp[i][1] = Math.min(dp[i][1], Math.min(dp[i - 2][1], i - 3 == 0? 0: dp[i - 3][1]) + Math.max(0, k - x));
                else dp[i][1] = Math.min(dp[i][1], Math.min(dp[i - 2][1], dp[i - 2][0]) + Math.max(0, k - x));
            }
        }
        if (dp[n][0] > dp[n][1]) return dp[n][1];
        return dp[n][0];
    }
}

解法2——记忆化搜索 翻译成递推

https://leetcode.cn/problems/minimum-increment-operations-to-make-array-beautiful/solutions/2503157/qiao-miao-she-ji-zhuang-tai-xuan-huo-bu-8547u/
在这里插入图片描述

dfs(i,j)表示前0~i个数字,且后面有j个不到k的数字,此时的最小花费

class Solution {
    int n, k;
    int[] nums;
    long[][] memo;

    public long minIncrementOperations(int[] nums, int k) {
        n = nums.length;
        this.k = k;
        this.nums = nums;
        memo = new long[n][3];
        for (long[] m: memo) Arrays.fill(m, -1);
        return dfs(n - 1, 0);
    }

    // dfs(i,j)表示前0~i个数字,且后面有j个不到k的数字,此时的最小花费
    public long dfs(int i, int j) {
        if (i < 0) return 0;
        if (memo[i][j] != -1) return memo[i][j];
        long res = dfs(i - 1, 0) + Math.max(0, k - nums[i]);    // 增加当前位置
        if (j < 2) res = Math.min(res, dfs(i - 1, j + 1));      // j<2时,可以不增加当前位置
        return memo[i][j] = res;
    }
}

1:1翻译成递推

自己改成了下面这样子。

class Solution {
    public long minIncrementOperations(int[] nums, int k) {
        int n = nums.length;
        // dp[i][j]表示到下标i,前面有j个位置没有到k(包括当前位置)
        long[][] dp = new long[n + 1][3];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < 3; ++j) {
                dp[i + 1][j] = dp[i][2] + Math.max(0, k - nums[i]);     // 不得不选
                if (j > 0) {
                    dp[i + 1][j] = Math.min(dp[i + 1][j], dp[i][j - 1]);// 可以不选
                }
            }
        }
        return Arrays.stream(dp[n]).min().getAsLong();
    }
}

Q4:2920. 收集所有金币可获得的最大积分⭐⭐⭐⭐⭐🐂

https://leetcode.cn/problems/maximum-points-after-collecting-coins-from-all-nodes/description/

在这里插入图片描述

在这里插入图片描述

解法1——自顶向下(记忆化搜索)

https://leetcode.cn/problems/maximum-points-after-collecting-coins-from-all-nodes/solutions/2503152/shu-xing-dp-ji-yi-hua-sou-suo-by-endless-phzx/
在这里插入图片描述

class Solution {
    List<Integer>[] g;
    int[] coins;
    int k;
    int[][] memo;

    public int maximumPoints(int[][] edges, int[] coins, int k) {
        int n = edges.length + 1;
        this.coins = coins;
        this.k = k;
        g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int[] e: edges) {
            g[e[0]].add(e[1]);
            g[e[1]].add(e[0]);
        }
        memo = new int[n][14];      // 该题目数据下最多右移14次变成0
        for (int i = 0; i < n; ++i) {
            Arrays.fill(memo[i], -1);
        }
        return dfs(0, -1, 0);
    }

    public int dfs(int x, int fa, int d) {
        if (memo[x][d] != -1) return memo[x][d];
        int res1 = (coins[x] >> d) - k;
        int res2 = coins[x] >> (d + 1);
        for (int y: g[x]) {
            if (y == fa) continue;
            res1 += dfs(y, x, d);
            if (d < 13) {
                res2 += dfs(y, x, d + 1);
            }
        }
        return memo[x][d] = Math.max(res1, res2);
    }
}

解法2——自底向上

自底向上每个节点都只会枚举一遍,不需要 记忆数组了。

class Solution {
    List<Integer>[] g;
    int[] coins;
    int k;

    public int maximumPoints(int[][] edges, int[] coins, int k) {
        int n = edges.length + 1;
        this.coins = coins;
        this.k = k;
        g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        for (int[] e: edges) {
            g[e[0]].add(e[1]);
            g[e[1]].add(e[0]);
        }
        return dfs(0, -1)[0];
    }

    public int[] dfs(int x, int fa) {
        int[] res1 = new int[14], res2 = new int[14];
        // 先得到各个子节点的结果
        for (int y: g[x]) {
            if (y != fa) {
                int[] r = dfs(y, x);
                for (int j = 0; j < 14; ++j) {
                    res1[j] += r[j];
                    if (j < 13) res2[j] += r[j + 1];
                }
            }
        }
        // 再逐个处理
        for (int j = 0; j < 14; ++j) {
            res1[j] = Math.max(res1[j] + (coins[x] >> j) - k, res2[j] + (coins[x] >> (j + 1)));
        }
        return res1;
    }
}

成绩记录

在这里插入图片描述
多的不说,排名挺吉利的。。
无奈遗憾掉分。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/208669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

带你用uniapp从零开发一个仿小米商场_10.开发一个占剩余窗口的滚动区域

首先是一个头部的tag切换栏,这个很简单,就不多说 源码奉上 <scroll-view scroll-x class"border scroll-row" style"height: 80rpx;"><view class"scroll-row-item" style"height: 80rpx;line-height: 80rpx;" v-for"(…

数学建模之相关系数模型及其代码

发现新天地&#xff0c;欢迎访问小铬的主页(www.xiaocr.fun) 引言 本讲我们将介绍两种最为常用的相关系数&#xff1a;皮尔逊pearson相关系数和斯皮尔曼spearman等级相关系数。它们可用来衡量两个变量之间的相关性的大小&#xff0c;根据数据满足的不同条件&#xff0c;我们要…

PyTorch入门教学——加载数据(Dataloader)

1、简介 PyTorch中如何读取数据主要涉及到两个类&#xff0c;分别为Dataset和Dataloader。 Dataset&#xff1a;创建可被Pytorch使用的数据集Dataloader&#xff1a;向模型传递数据本文主要讲解Dataloader的使用方法。 2、Dataloader 2.1、查看使用方法 查看官网文档&#…

matlab simulink PMSM电机转速预估

1、内容简介 略 22-可以交流、咨询、答疑 2、内容说明 PMSM电机转速预估 PMSM电机转速预估 PMSM、转速估计&#xff0c;PID控制 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk1w 提取码&#xff1a;rvol

计算机视觉(OpenCV+TensorFlow)

计算机视觉&#xff08;OpenCVTensorFlow&#xff09; 文章目录 计算机视觉&#xff08;OpenCVTensorFlow&#xff09;前言3.图像金字塔3.1 高斯金字塔3.2 拉普拉斯金字塔 4.图像轮廓图像边缘和图像轮廓的区别检测图像绘制边缘 5.轮廓近似外接矩形外接圆 6. 模板匹配6.1 什么是…

LeetCode 1212 查询球队积分(PostgreSQL)

数据准备 Create table If Not Exists Teams (team_id int, team_name varchar(30)) Create table If Not Exists Matches (match_id int, host_team int, guest_team int, host_goals int, guest_goals int) Truncate table Teams insert into Teams (team_id, team_name) va…

关于pytorch安装成功后No module name ‘torch‘的解决方法

一、pytorch环境配置 1、Pytorch 的安装 &#xff08;1&#xff09;单击启动 Anaconda Prompt 创建虚拟房间 &#xff08;2&#xff09;输入py -0p查看当前python版本 或者这里不清楚自己 python 版本的可以 cmd 命令行输入 python 查询 &#xff08;3&#xff09;输入命令…

Jetson Nano部署YOLOv5与Tensorrtx加速

一、烧录镜像 1、Jetson Nano烧写系统镜像 Jetson Nano是一款形状、外接口类似于树莓派的嵌入式主板&#xff0c;搭载了四核Cortex-A57处理器&#xff0c;GPU则是拥有128个NVIDIA CUDA核心的NVIDIA Maxwell架构显卡&#xff0c;内存为4GB的LPDDR4&#xff0c;存储则为16GB eM…

『 Linux 』环境变量

文章目录 &#x1f680;什么是环境变量&#x1f680;&#x1f680;查看环境变量&#x1f680;&#x1f579;️和环境变量有关的命令&#x1f579;️ &#x1f680;PATH环境变量&#x1f680;&#x1f579;️设置PATH环境变量&#x1f579;️ &#x1f680;HOME环境变量&#x1…

vue 前端实现login页登陆 验证码

实现效果 // template <el-form :model"loginForm" :rules"fieldRules" ref"loginForm" label-position"left" label-width"0px" class"login-container"><span class"tool-bar"></sp…

解决VSCode按住Ctrl(or Command) 点击鼠标左键不跳转的问题(不能Go to Definition)

问题出现 往往在升级了VSCode以后&#xff0c;就会出现按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转的问题&#xff0c;这个问题很常见。 解决办法 1 进入VScode的首选项&#xff0c;选择设置 2 输入Go to definition&#xff0c;找到如下两个设置&#…

逸学java【初级菜鸟篇】11.多线程【多方位详解】

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 本章没有任务目标&#xff0c;略述概述多线程一隅&#xff0c;全是精华。 线程 进程 在提到线程是什么之前我们还需要提到另一个名词 他就是进程 进程&#xff1a;是指一个内存中运…

如何删除mac苹果电脑上面的流氓软件?

在使用苹果电脑的过程中&#xff0c;有时候我们也会遇到一些不需要的软件。无论是因为不再需要&#xff0c;或者是为了释放磁盘空间&#xff0c;删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件&#xff01; CleanMyMac X全新版下载如下: https://wm.make…

springboot + vue 智能物流管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

FL Studio(水果软件)2024最新中文版云盘下载

如今&#xff0c;越来越多的音乐人选择使用音乐制作软件来进行音乐的创作&#xff0c;一台电脑、一款软件以及一个外接MIDI就是一个小型的音乐工作站。FL Studio成了音乐界萌新的首选&#xff0c;目前最新的版本为FL Studio2024版本。 你可以不知道如何做音乐&#xff0c;但是…

你对SPA单页面的理解,它的优缺点分别是什么?

面试官&#xff1a;你对SPA单页面的理解&#xff0c;它的优缺点分别是什么&#xff1f;如何实现SPA应用呢 一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当…

微信小程序 slider 翻转最大和最小值

微信小程序 slider 翻转最大和最小值 场景代码示例index.wxmlindex.jsutil.js 参考资料 场景 我想使用 slider 时最左边是 10 最右是 -10。 但是想当然的直接改成<slider min"10" max"-10" step"1" /> 并没用。 查了文档和社区也没有现成…

HarmonyOs 4 (二) HelloWord

目录 一 开发工具下载安装1.1 下载安装包1.2 下载相关依赖 二 开发者注册与个人实名认证三 第一个程序2.1 创建第一个程序2.2 认识开发者界面2.3 目录结构认识2.3.1 父目录认识2.3.2 AppScope 目录2.3.3 entry目录2.3.3.1 ets 目录2.3.3.2 resources目录 2.3.4 认识配置文件2.3…

(四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…