回顾前面刷过的算法(6)

embedded/2024/9/24 7:52:20/

今天回顾一下这几道算法

java">//最小栈//思路: 定义一个带有val、min、next 三个属性的节点,其中min表示除当前节点外剩余节点中最小的节点值,//以链表的形式存储节点,每次push节点都是插入到root后一个节点,删除也是root后一个节点,每次插入/删除都需要//更新root和插入/删除节点的min值class MinStack {class Node {int val, min;Node next;public Node() {this.min = Integer.MAX_VALUE;}public Node(int val) {this.val = val;}public Node(int val, Node next) {this.val = val;this.next = next;}}Node root;public void push(int val) {Node node = new Node(val, root.next);node.min = root.min;root.next = node;root.min = Math.min(root.min, val);}public void pop() {Node cur = root.next;if (cur.val == root.min) {root.min = cur.min;}root.next = cur.next;cur.next = null;}public Node getTop() {return root.next;}public int getMin() {return root.min;}}//前K个高频元素//思路: 采用桶排序思路,就是先用hashMap统计每个元素出现的次数,然后在以value为索引,key为值存储到一个list//集合数组中,我们只需要从尾遍历list即可找到前k个高频元素public int[] topKFrequent(int[] nums, int k) {HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {if (map.containsKey(num)) {map.put(num, map.get(num) + 1);} else {map.put(num, 1);}}List<Integer>[] list = new List[nums.length + 1];for (int key : map.keySet()) {int value = map.get(key);if (list[value] == null) {list[value] = new ArrayList<>();}list[value].add(key);}int[] res = new int[k];for (int i = nums.length, j = 0; i >= 0 && j < k; i--) {if (list[i] != null) {for (int num : list[i]) {res[j++] = num;}}}return res;}//比特位计数//0  01  10  11  100  101  110  111//0  1   2   3   4    5    6    7//思路: 维护一个highBit记录当前为2整数次幂元素的最高位是第几位//其中存在这么一个关系  bits[i] = bits[i - highBit] + 1;//bits[i] 表示元素i的比特位有多少个1public int[] countBits(int n) {int[] bits = new int[n + 1];int highBit = 0;for (int i = 1; i <= n; i++) {if ((i & (i - 1)) == 0) {highBit = i;}bits[i] = bits[i - highBit] + 1;}return bits;}//打家劫舍III//思路: 定义两个map存储最大值,f存储选中当前节点时的最大值//g存储不选中当前节点时的最大值Map<TreeNode, Integer> f = new HashMap<>();Map<TreeNode, Integer> g = new HashMap<>();public int rob(TreeNode root) {dfs(root);return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0));}private void dfs(TreeNode node) {if (node == null) {return;}dfs(node.left);dfs(node.right);f.put(node, node.val + g.getOrDefault(node.left, 0) +g.getOrDefault(node.right, 0));g.put(node, Math.max(f.getOrDefault(node.left, 0), g.getOrDefault(node.left, 0)) +Math.max(f.getOrDefault(node.right, 0), g.getOrDefault(node.right, 0)));}//寻找重复数//思路: 因为数组是【1,n】的,且存在重复数,我们//可以把value当作数组索引,然后利用快慢指针思想进行遍历public int findDuplicate(int[] nums) {int slow = 0, fast = 0;do {slow = nums[slow];fast = nums[nums[fast]];} while (slow != fast);slow = 0;while (slow != fast) {slow = nums[slow];fast = nums[fast];}return slow;}


http://www.ppmy.cn/embedded/97752.html

相关文章

认识微服务

什么是微服务&#xff1f; 微服务是一种软件架构风格&#xff0c;它将一个大型的应用程序拆分成一组小的、自治的服务单元。每个服务单元都运行在独立的进程中&#xff0c;通过轻量级的通信机制&#xff08;如HTTP/RESTful API、消息队列等&#xff09;进行交互&#xff0c;并且…

C++观察者模式:订阅博主~

目录 观察者模式步骤例子&#xff1a;订阅博主UML图1&#xff1a;定义观察者接口2&#xff1a;定义被观察者接口3&#xff1a;创建具体观察者类4&#xff1a;创建具体被观察者类5&#xff1a;使用执行结果 观察者模式 观察者模式允许我们定义一种订阅机制&#xff0c;可在对象…

C#使用onnxruntime加载模型,部署到别人的PC上报错

C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错解决方案 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错&#xff1a; Sys…

UE5.4 用自带OpenCV4.55读取png、MP4、摄像头并在ui中显示的方法

创建c项目&#xff0c;项目build.cs中开启模块&#xff1a; // Copyright Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class OpencvT : ModuleRules {public OpencvT(ReadOnlyTargetRules Target) : base(Target){PCHUsage PCHUsageMode.UseExplici…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…

Windows Server 2012 R2服务器安装CVE-2024-38077补丁KB5040456的安装及问题解决

Windows 远程桌面授权服务远程代码执行漏洞CVE-2024-38077&#xff0c;该漏洞影响: 远程执行代码&#xff0c;漏洞最高严重性: 严重。本文记录了Windows Server 2012 R2服务器补丁KB5040456的安装及报错“此更新不适用于你的计算机”的问题解决过程。 一、漏洞相关信息 1.影响…

《计算机组成原理》(第3版)考研真题

一、选择题 1&#xff0e;冯诺依曼计算机中指令和数据均以二进制形式存放在存储器中&#xff0c;CPU区分它们的依据是(  )。[2009年统考] A&#xff0e;指令操作码的译码结果 B&#xff0e;指令和数据的寻址方式 C&#xff0e;指令周期的不同阶段 D&#xff0e;指令和数据所在…

C语言内存操作函数

目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累&#xff0c;我们所想要实现的目标程序就会更加复杂&#xff0c;今天我们来学习一个新的知识叫做C语言内存操作函数&#x…