【LeetCode每日一题合集】2023.9.18-2023.9.24(⭐拓扑排序⭐设计数据结构:LRU缓存实现 LinkedHashMap⭐)

文章目录

  • 337. 打家劫舍 III(树形DP)
  • 2560. 打家劫舍 IV(二分查找+动态规划)
  • LCP 06. 拿硬币(简单贪心模拟)
  • 2603. 收集树中金币⭐
    • 思路——拓扑排序删边
  • 2591. 将钱分给最多的儿童(分类讨论)
  • 1993. 树上的操作💩(设计数据结构)
  • 146. LRU 缓存(⭐数据结构:哈希表+双向链表)
    • 解法1——哈希表+双向链表⭐
    • 解法2——Java JDK LinkedHashMap
      • 补充——LinkedHashMap
      • 补充——Java修饰符

337. 打家劫舍 III(树形DP)

https://leetcode.cn/problems/house-robber-iii/description/?envType=daily-question&envId=2023-09-18

在这里插入图片描述
提示:
树的节点数在 [1, 10^4] 范围内
0 <= Node.val <= 10^4

class Solution {public int rob(TreeNode root) {int[] res = dfs(root);return Math.max(res[0], res[1]);}public int[] dfs(TreeNode root) {// 返回值{a,b} a表示没选当前节点的最大值,b表示选了当前节点的最大值if (root == null) return new int[]{0, 0};int[] l = dfs(root.left), r = dfs(root.right);int a = Math.max(l[0], l[1]) + Math.max(r[0], r[1]), b = root.val + l[0] + r[0];return new int[]{a, b};}
}

2560. 打家劫舍 IV(二分查找+动态规划)

https://leetcode.cn/problems/house-robber-iv/description/?envType=daily-question&envId=2023-09-19

在这里插入图片描述
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
1 <= k <= (nums.length + 1)/2

二分查找答案。 对于每次查找,判断是否可以至少偷k家。

class Solution {public int minCapability(int[] nums, int k) {if (nums.length == 1) return nums[0];int l = Integer.MAX_VALUE, r = Integer.MIN_VALUE;for (int x: nums) {l = Math.min(l, x);r = Math.max(r, x);}// 二分查找答案while (l < r) {int mid = l + r >> 1;if (op(nums, mid) >= k) r = mid;else l = mid + 1;}return l;}// 动态规划public int op(int[] nums, int k) {int n = nums.length;int[] dp = new int[n];      // dp[i]表示0~i中最多能偷几个dp[0] = nums[0] <= k? 1: 0;dp[1] = Math.max(dp[0], nums[1] <= k? 1: 0);for (int i = 2; i < n; ++i) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + (nums[i] <= k? 1: 0));}return dp[n - 1];}
}

LCP 06. 拿硬币(简单贪心模拟)

https://leetcode.cn/problems/na-ying-bi/

在这里插入图片描述

class Solution {public int minCount(int[] coins) {int ans = 0;for (int x: coins) ans += (x + 1) / 2;return ans;}
}

2603. 收集树中金币⭐

https://leetcode.cn/problems/collect-coins-in-a-tree/description/?envType=daily-question&envId=2023-09-21

在这里插入图片描述
提示:
n == coins.length
1 <= n <= 3 * 10^4
0 <= coins[i] <= 1
edges.length == n - 1
edges[i].length == 2
0 <= ai, bi < n
ai != bi
edges 表示一棵合法的树。

难度分 2712 是因为当时美国站点崩了,很多人没看到题。

思路——拓扑排序删边

https://leetcode.cn/problems/collect-coins-in-a-tree/solutions/2191371/tuo-bu-pai-xu-ji-lu-ru-dui-shi-jian-pyth-6uli/?envType=daily-question&envId=2023-09-21

先去掉所有没有金币的叶子节点。
再去掉最外两层的节点。
最后的答案就是剩余的边数 * 2。

class Solution {public int collectTheCoins(int[] coins, int[][] edges) {int n = coins.length;List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());int[] deg = new int[n];     // 记录每个节点的入度for (int[] e: edges) {int x = e[0], y = e[1];g[x].add(y);g[y].add(x);deg[x]++;deg[y]++;}int leftEdges = n - 1;      // 记录剩余的边数// 拓扑排序,去掉所有没有金币的子树Queue<Integer> q = new LinkedList<>();for (int i = 0; i < n; ++i) {if (deg[i] == 1 && coins[i] == 0) q.offer(i);}while (!q.isEmpty()) {leftEdges--;            // 删除当前节点和其父节点之间的边for (int y: g[q.poll()]) {if (--deg[y] == 1 && coins[y] == 0) {q.offer(y);}}}// 再次拓扑排序,删除最外两层的节点for (int i = 0; i < n; ++i) {if (deg[i] == 1 && coins[i] == 1) q.offer(i);}leftEdges -= q.size();for (int x: q) {for (int y: g[x]) {if (--deg[y] == 1) leftEdges--;}}return Math.max(leftEdges * 2, 0);}
}

2591. 将钱分给最多的儿童(分类讨论)

https://leetcode.cn/problems/distribute-money-to-maximum-children/description/?envType=daily-question&envId=2023-09-22
在这里插入图片描述

class Solution {public int distMoney(int money, int children) {if (money < children) return -1;money -= children;int x = Math.min(money / 7, children);      // 计算最多多少个儿童分到8美元int y = money - x * 7;                      // 计算剩余的美元if ((x == children - 1 && y == 3 ) || (x == children  && y > 0)) return x - 1;return x;}
}

1993. 树上的操作💩(设计数据结构)

https://leetcode.cn/problems/operations-on-tree/description/?envType=daily-question&envId=2023-09-23
在这里插入图片描述
提示:
n == parent.length
2 <= n <= 2000
对于 i != 0 ,满足 0 <= parent[i] <= n - 1
parent[0] == -1
0 <= num <= n - 1
1 <= user <= 10^4
parent 表示一棵合法的树。
lock ,unlock 和 upgrade 的调用 总共 不超过 2000 次。

class LockingTree {int[] parent;int[] lockNodeUser;List<Integer>[] g;      // 存储所有儿子public LockingTree(int[] parent) {int n = parent.length;this.parent = parent;lockNodeUser = new int[n];Arrays.fill(lockNodeUser, -1);g = new List[n];Arrays.setAll(g, e -> new ArrayList<>());for (int i = 0; i < n; ++i) {if (parent[i] != -1) g[parent[i]].add(i);}}public boolean lock(int num, int user) {if (lockNodeUser[num] == -1) {lockNodeUser[num] = user;return true;}return false;}public boolean unlock(int num, int user) {if (lockNodeUser[num] == user) {lockNodeUser[num] = -1;return true;}return false;}public boolean upgrade(int num, int user) {// 自己没被上锁,没有祖宗上锁,有子孙节点上锁了boolean res = lockNodeUser[num] == -1 && !hasLockedAncestor(num) && checkAndUnlockDescendant(num);if (res) lockNodeUser[num] = user;return res;}// 是否有祖宗节点被上锁public boolean hasLockedAncestor(int num) {num = parent[num];while (num != -1) {if (lockNodeUser[num] != -1) return true;num = parent[num];}return false;}// 是否有子孙节点被上锁,并解锁public boolean checkAndUnlockDescendant(int num) {boolean res = lockNodeUser[num] != -1;lockNodeUser[num] = -1;         for (int y: g[num]) {res |= checkAndUnlockDescendant(y);}return res;}
}/*** Your LockingTree object will be instantiated and called as such:* LockingTree obj = new LockingTree(parent);* boolean param_1 = obj.lock(num,user);* boolean param_2 = obj.unlock(num,user);* boolean param_3 = obj.upgrade(num,user);*/

这题的重点在于操作三的实现。

146. LRU 缓存(⭐数据结构:哈希表+双向链表)

https://leetcode.cn/problems/lru-cache/description/?envType=daily-question&envId=2023-09-24

在这里插入图片描述
提示:

1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 10^5
最多调用 2 * 10^5 次 get 和 put

解法1——哈希表+双向链表⭐

双向链表维护各个节点被使用的情况,头节点是最近被使用的,尾节点是最久未被使用的。
哈希表维护key和节点之间的映射,帮助快速找到指定key的节点。

class LRUCache {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {};public DLinkedNode(int _key, int _value) {this.key = _key;this.value = _value;}}Map<Integer, DLinkedNode> cache = new HashMap<>();  // key和节点的映射int size = 0;       // 大小int capacity;       // 容量// 虚拟头尾节点DLinkedNode head = new DLinkedNode(), tail = new DLinkedNode();public LRUCache(int capacity) {this.capacity = capacity;head.next = tail;tail.prev = head;}public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) return -1;moveToHead(node);return node.value;}public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {DLinkedNode newNode = new DLinkedNode(key, value);cache.put(key, newNode);addToHead(newNode);++size;if (size > capacity) {DLinkedNode last = removeTail();    cache.remove(last.key);--size;} } else {node.value = value;moveToHead(node);}}// 将节点添加到头部public void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}// 删除节点public void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;}// 将节点移动到头部public void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);}// 删除最后一个节点public DLinkedNode removeTail() {DLinkedNode node = tail.prev;removeNode(node);return node;}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

解法2——Java JDK LinkedHashMap

class LRUCache extends LinkedHashMap<Integer, Integer>{private int capacity;public LRUCache(int capacity) {super(capacity, 0.75F, true);this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {return size() > capacity;} 
}

补充——LinkedHashMap

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedHashMap.html

构造器:
在这里插入图片描述

在这里插入图片描述


protected boolean removeEldestEntry​(Map.Entry<K,​V> eldest)
如果此映射应该删除其最年长的条目,则返回true。在向映射中插入新条目后,put和putAll调用该方法。它为实现者提供了每次添加新条目时删除最老条目的机会。如果映射表示缓存,这很有用:它允许映射通过删除过时的条目来减少内存消耗。
在这里插入图片描述

补充——Java修饰符

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一份优秀测试用例的设计策略

日常工作中最为基础核心的内容就是设计测试用例&#xff0c;什么样的测试用例是好的测试用例?我们一般会认为数量越少、发现缺陷越多的用例就是好的用例。那么我们如何才能设计出好的测试用例呢&#xff1f;一份好的用例是设计出来的&#xff0c;是测试人员思路和方法的集合&a…

数字博物馆如何设计搭建,一文了解数字博物馆解决方案

导言&#xff1a; 数字博物馆是一种创新性的文化机构&#xff0c;通过数字技术的应用&#xff0c;将传统博物馆的宝贵文化遗产以全新的方式呈现给观众。 一.数字博物馆是什么 博物馆是指利用数字技术和互联网等新媒体技术来展示和传播文物、艺术品等文化遗产的博物馆。数字物…

康耐视VisionPro+C#程序编写

添加引用&#xff0c;用什么就添加什么 康耐视控件名 代码实现 引用命名空间 using Cognex.VisionPro.PMAlign; 实例化工具及训练区域设置 CogPMAlignTool cogPMAlignTool new CogPMAlignTool(); cogPMAlignTool.InputImage cogImageFileTool.OutputImage as CogImage8…

软件测试面试最经典的5个问题

软件测试面试灵魂五问&#xff01; 请做一下自我介绍&#xff1f;你为什么从上家公司离职&#xff1f;为什么转行做测试? 你对测试行业的认识&#xff1f;你的期望薪资是多少&#xff1f;最后&#xff0c;你要问我什么&#xff1f; 一、请做一下自我介绍 简历上有的可以一两…

分享一下怎么做小程序营销活动

小程序营销活动已经成为现代营销的必备利器&#xff0c;它能够帮助企业提高品牌知名度、促进产品销售&#xff0c;以及加强与用户的互动。然而&#xff0c;要想成功地策划和执行一个小程序营销活动&#xff0c;需要精心设计和全面规划。本文将为您介绍小程序营销活动的策划和执…

Element UI的table不同应用

目录 一、自定义表头 二、纵向表头(动态表头) 2.1、分别拿到表头和表头中日期对应的行数据 2.2、拿到每个日期对应的列数据 一、自定义表头 <el-table-column prop"chu" align"center"><!-- 自定义表头 --><template slot"header…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

Linux CentOS配置阿里云yum源

一&#xff1a;先备份文件&#xff0c;在配置失败时可以恢复 cd /etc/yum.repos.d mkdir back mv *.repo back 二&#xff1a;下载阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.…

[SSD综述 1.4] SSD固态硬盘的架构和功能导论

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< ​ 前言 机械硬盘的存储系统由于内部结构, 其IO访问性能无法进一步提高,CPU与存储器之间的性能差距逐渐扩大。以Nand Flash为存储介质的固态硬盘技术的发展,…

如何处理msvcp110.dll缺失的问题,msvcp110.dll修复方法分享

当我们试图运行用Visual Studio 2012开发的应用程序时&#xff0c;有时可能会收到一个错误提示&#xff1a;“程序无法启动&#xff0c;因为计算机中丢失了msvcp110.dll”。这是非常常见的DLL&#xff08;动态链接库&#xff09;错误之一。它通常是因为该dll文件丢失或损坏所造…

Unity中Shader的GI的间接光实现

文章目录 前言一、GI中 间接光照的实现1、看Unity的源码可知&#xff0c;在计算GI的间接光照时&#xff0c;最主要的实现是在UnityGI_Base函数中 二、分析 UnityGI_Base 中实现的功能1、ResetUnityGI的作用2、第一个#if中实现的功能&#xff1a;计算在Distance Shadowmask 中实…

Python新手必读:容器类型使用的实用小贴士

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python提供了多种容器类型&#xff0c;如列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;、字典&#xff08;Dictionary&#xff09;等&#xff0c;用于…

【GEE】5、遥感影像预处理【GEE栅格预处理】

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 了解常用于遥感影像的数据校正类型。如何直观地比较同一数据集中不同预处理级别的空间数据。如何在 Google Earth Engine for Landsat 8 表面反射率图像中执行云遮蔽和云遮蔽评估。 2背景 什么是预处理&#xff…

【性能测试】数据库索引问题定位/分析+ 架构优化+ SQL优化+ 代码优化(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 索引问题定位与分…

MapReduce:大数据处理的范式

一、介绍 在当今的数字时代&#xff0c;生成和收集的数据量正以前所未有的速度增长。这种数据的爆炸式增长催生了大数据领域&#xff0c;传统的数据处理方法往往不足。MapReduce是一个编程模型和相关框架&#xff0c;已成为应对大数据处理挑战的强大解决方案。本文探讨了MapRed…

文本内容转换成语音播放的工具:Speech Mac

Speech Mac版是一款适用于Mac电脑的语音合成工具。它将macOS语音合成器的所有功能整合到一个易于使用的界面中。通过Speech Mac版&#xff0c;用户可以选择40多种声音和语言&#xff0c;方便地将文本转换为语音。用户可以将文本拖放或粘贴到Speech中&#xff0c;并随时更改语音…

TCP/IP--七层通信

文章目录 TCP/IP--七层通信先来看一下会话层以上的处理再来看一下传输层以下的处理 TCP/IP–七层通信 下面举例说明7层网络模型的功能。假设使用主机A的用户A要给使用主机B的用户B发送一封电子邮件。 在七层OSI模型中&#xff0c;如何模块化通信传输&#xff1f; 先来看一下七…

基础课23——设计客服机器人

根据调查数据显示&#xff0c;使用纯机器人完全替代客服的情况并不常见&#xff0c;人机结合模式的使用更为普遍。在这两种模式中&#xff0c;不满意用户的占比都非常低&#xff0c;不到1%。然而&#xff0c;在满意用户方面&#xff0c;人机结合模式的用户满意度明显高于其他模…

专访虚拟人科技:如何利用 3DCAT 实时云渲染打造元宇宙空间

自古以来&#xff0c;人们对理想世界的探索从未停止&#xff0c;而最近元宇宙的热潮加速了这一步伐&#xff0c;带来了许多新的应用。作为元宇宙的关键入口&#xff0c;虚拟现实&#xff08;VR&#xff09;将成为连接虚拟和现实的桥梁。苹果发布的VISION PRO头戴设备将人们对VR…

响应式特性

前言 持续学习总结输出中&#xff0c;今天分享的是响应式特性 1.什么是响应式&#xff1f; 简单理解就是数据变&#xff0c;视图对应变。 数据的响应式处理→ 响应式:数据变化&#xff0c;视图自动更新 聚焦于数据 → 数据驱动视图 使用 Vue 开发&#xff0c;我们主要关注…