hot100(7)

61.31. 下一个排列 - 力扣(LeetCode)

数组问题,下一个更大的排列

题解:31. 下一个排列题解 - 力扣(LeetCode)

(1)从后向前找到一个相邻的升序对(i,j),此时(j,end)为降序

(2)从(j,end)从后向前找到一个大于i对应的数,其下标k,这个数就是要替换的“较小的大数”

(3)交换i和k对应的数

(4)此时(j,end)为降序,将(j,end)置为升序

public void nextPermutation(int[] nums) {int i,j,k;for(i = nums.length - 2 ; i >= 0 ; i--){if(nums[i] < nums[i+1]){break;}}j = i + 1;if(i == -1){Arrays.sort(nums);return ;}for(k = nums.length - 1 ; k >= j ; k--){if(nums[k] > nums[i]){break;}}int tmp = nums[i];nums[i] = nums[k];nums[k] = tmp;Arrays.sort(nums,j,nums.length);}

62.538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后再遍历其他节点累加?怎么一想这么麻烦呢。

然后再发现这是一棵二叉搜索树,二叉搜索树啊,这是有序的啊。

那么有序的元素如何求累加呢?

其实这就是一棵树,大家可能看起来有点别扭,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13],是不是感觉这就简单了。

为什么变成数组就是感觉简单了呢?

因为数组大家都知道怎么遍历啊,从后向前,挨个累加就完事了,这换成了二叉搜索树,看起来就别扭了一些是不是。

那么知道如何遍历这个二叉树,也就迎刃而解了,从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了

像前面的数组的累加遍历,需要用到前一个处理过的元素的值和当前元素累加,本题页需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。

int prev = 0;public TreeNode convertBST(TreeNode root) {reverseInOrder(root);return root;}public void reverseInOrder(TreeNode root){if(root == null){return ;}reverseInOrder(root.right);root.val += prev;prev = root.val;reverseInOrder(root.left);}

63.23. 合并 K 个升序链表 - 力扣(LeetCode)

方法一:顺序合并
思路

我们可以想到一种最朴素的方法:用一个变量 ans 来维护以及合并的链表,第 i 次循环把第 i 个链表和 ans 合并,答案保存到 ans 中。

public ListNode mergeKLists(ListNode[] lists) {ListNode ans = null;for (ListNode list : lists) {ans = mergeTwoLists(ans,list);}return ans;}public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head = new ListNode(0);ListNode p = head;ListNode pa = list1 , pb = list2;while(pa != null && pb != null){if(pa.val < pb.val){p.next = pa;pa = pa.next;}else{p.next = pb;pb = pb.next;}p = p.next;}p.next = (pa != null)? pa : pb;return head.next;}

public ListNode mergeKLists(ListNode[] lists) {return merge(lists,0,lists.length - 1);}public ListNode merge(ListNode[] lists,int l, int r){if(l == r){return lists[l];}if(l > r){return null;}int mid = l + (r - l)/2;return mergeTwoLists(merge(lists,l,mid),merge(lists,mid + 1, r));}public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head = new ListNode(0);ListNode p = head;ListNode pa = list1 , pb = list2;while(pa != null && pb != null){if(pa.val < pb.val){p.next = pa;pa = pa.next;}else{p.next = pb;pb = pb.next;}p = p.next;}p.next = (pa != null)? pa : pb;return head.next;}

class Status implements Comparable<Status>{int val;ListNode ptr;Status(int val , ListNode ptr){this.val = val;this.ptr = ptr;}@Overridepublic int compareTo(Status o) {return this.val - o.val;}}public ListNode mergeKLists(ListNode[] lists) {PriorityQueue<Status> queue = new PriorityQueue<>();for (ListNode list : lists) {if(list != null){queue.offer(new Status(list.val,list));}}ListNode head = new ListNode(0);ListNode tail = head;while(!queue.isEmpty()){Status f = queue.poll();tail.next = f.ptr;tail = tail.next;if(f.ptr.next != null){queue.offer(new Status(f.ptr.next.val,f.ptr.next));}}return head.next;}

64.560. 和为 K 的子数组 - 力扣(LeetCode)

I枚举

枚举所有子数组并计算其和,枚举时先枚举结尾,再枚举开头,让开头倒序遍历,可以让后面的计算用到前面计算的结果。

public int subarraySum(int[] nums, int k) {int cnt = 0;for(int i = 0 ; i < nums.length ; i++){int sum = 0 ;for(int j = i ; j >= 0; j--){sum = sum + nums[j];if(sum == k){cnt++;}}}return cnt;}

时间复杂度O(n^2),空间复杂度O(1)

II 前缀和 + 哈希表

public int subarraySum(int[] nums, int k) {int pre = 0 ,cnt = 0;HashMap<Integer,Integer> map = new HashMap<>();map.put(0,1);for(int i = 0 ; i < nums.length ; i++){pre += nums[i];if(map.containsKey(pre - k)){cnt += map.get(pre - k);}map.put(pre,map.getOrDefault(pre,0) + 1);}return cnt;}

 65.21. 合并两个有序链表 - 力扣(LeetCode)

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head = new ListNode(0);ListNode p = head;ListNode pa = list1 , pb = list2;while(pa != null && pb != null){if(pa.val < pb.val){p.next = pa;pa = pa.next;}else{p.next = pb;pb = pb.next;}p = p.next;}p.next = (pa != null)? pa : pb;return head.next;}

66.20. 有效的括号 - 力扣(LeetCode)

public boolean isValid(String s) {Deque<Character> stack = new ArrayDeque<>();for(int i = 0 ; i < s.length() ; i++){if(isLeft(s.charAt(i))){stack.push(s.charAt(i));}else{if(stack.isEmpty()){return false;}else if(s.charAt(i) == ')'){if(stack.pop() != '('){return false;}}else if(s.charAt(i) == '}'){if(stack.pop() != '{'){return false;}}else if(s.charAt(i) == ']'){if(stack.pop() != '['){return false;}}}}return stack.isEmpty();}public boolean isLeft(char c){if(c == '(' || c == '{' || c =='['){return true;}return false;}

67.19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

快慢指针

dummyNode避免边界条件讨论

在纸上画出后观察边界条件

public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyNode = new ListNode(0);dummyNode.next = head;ListNode fast = dummyNode,slow = dummyNode;for(int i = 0 ; i < n ; i++){fast = fast.next;}while(fast.next != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummyNode.next;}

68.17. 电话号码的字母组合 - 力扣(LeetCode)

回溯问题

String[] mapping = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};List<String> res = new ArrayList<>();StringBuilder path = new StringBuilder();String digits;public List<String> letterCombinations(String digits) {this.digits = digits;if(digits.isEmpty()){return res;}dfs(0);return res;}public void dfs(int index){if(index == digits.length()){res.add(new String(path));return ;}int digit = digits.charAt(index) - '0';String s = mapping[digit];for (char c : s.toCharArray()) {path.append(c);dfs(index + 1);path.deleteCharAt(path.length() - 1);}}

69.15. 三数之和 - 力扣(LeetCode)

双指针

算法讲解:两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili

降低时间复杂度的原因:利用数组有序的特性,用O(1)的时间得到了O(n)的信息(某个数和任何数相加都小于target或某个数和任何数相加都大于target)

public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> res = new ArrayList<>();for(int i = 0 ; i < nums.length - 2 ; i++){int j = i + 1;int k = nums.length - 1;if(nums[i] > 0){return res;}if(i > 0 && nums[i] == nums[i-1]){continue;}while(j < k){int s = nums[i] + nums[j] +nums[k];if(s > 0){k--;}else if(s < 0){j++;}else{res.add(List.of(nums[i],nums[j],nums[k]));while(j < k && nums[j] == nums[j+1]){j++;}while(j < k && nums[k] == nums[k-1]){k--;}j++;k--;}}}return res;}

70.11. 盛最多水的容器 - 力扣(LeetCode)

双指针

用分析,尝试用O(1)的操作获得O(n)的信息

对于当前盛水的较短者,中间任意一根垂线与其组成的容器,其容量都不会大于当前的容量(高不会超过当前容器的高,宽会比当前容器的宽更小),如果要找到一个容量更大的容器,肯定不会包括这条线。

题解:盛最多水的容器 接雨水_哔哩哔哩_bilibili

public int maxArea(int[] height) {int i = 0 , j = height.length - 1;int area = 0;int ans = 0;while(i < j){int h = Math.min(height[i],height[j]);area = h *(j-i);ans = Math.max(area,ans);if(height[i] < height[j]){i++;}else{j--;}}return ans;}

每次花费O(1)的时间就去掉了一条垂线,时间复杂度O(n),空间复杂度O(1)

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

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

相关文章

图像分类与目标检测算法

在计算机视觉领域&#xff0c;图像分类与目标检测是两项至关重要的技术。它们通过对图像进行深入解析和理解&#xff0c;为各种应用场景提供了强大的支持。本文将详细介绍这两项技术的算法原理、技术进展以及当前的落地应用。 一、图像分类算法 图像分类是指将输入的图像划分为…

记录一次-Rancher通过UI-Create Custom- RKE2的BUG

一、下游集群 当你的下游集群使用Mysql外部数据库时&#xff0c;会报错&#xff1a; **他会检查ETCD。 但因为用的是Mysql外部数据库&#xff0c;这个就太奇怪了&#xff0c;而且这个检测不过&#xff0c;集群是咩办法被管理的。 二、如果不选择etcd,就选择控制面。 在rke2-…

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

MySQL表的CURD

目录 一、Create 1.1单行数据全列插入 1.2多行数据指定列插入 1.3插入否则更新 1.4替换 2.Retrieve 2.1 select列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2where条件 2.3结果排序 2.4筛选分页结果 三…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…

(9)gdb 笔记(2):查看断点 info b,删除断点 delete 3,回溯 bt,

&#xff08;11&#xff09; 查看断点 info b&#xff1a; # info b举例&#xff1a; &#xff08;12&#xff09;删除断点 delete 2 或者删除所有断点&#xff1a; # 1. 删除指定的断点 delete 3 # 2. 删除所有断点 delete 回车&#xff0c;之后输入 y 确认删除所有断点 举…

游戏引擎学习第88天

仓库:https://gitee.com/mrxiao_com/2d_game_2 调查碰撞检测器中的可能错误 在今天的目标是解决一个可能存在的碰撞检测器中的错误。之前有人提到在检测器中可能有一个拼写错误&#xff0c;具体来说是在测试某个变量时&#xff0c;由于引入了一个新的变量而没有正确地使用它&…

【2025】camunda API接口介绍以及REST接口使用(3)

前言 在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用&#xff0c;以及相关api介绍。 该专栏主要为介绍camunda的学习和使用 &#x1f345;【2024】Camunda常用功能基本详细介绍和使用-下&#xff08;1&…

Java高频面试之SE-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java缓冲区溢出&#xff0c;如何解决&#xff1f; 在 Java 中&#xff0c;缓冲区溢出 (Buffer Overflow) 虽然不是像 C/C 中那样直接可见…

用 Python 绘制爱心形状的简单教程

1. 引言 在本教程中&#xff0c;我们将学习如何使用 Python 和 Matplotlib 库来绘制一个简单的爱心形状。这是一个有趣且简单的项目&#xff0c;适合初学者练习图形绘制和数据可视化。 2. 环境准备 首先&#xff0c;确保您的系统上安装了 Python 和 Matplotlib 库。如果还未…

107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World

这次先不进入靶场 看到红框里面的话就想先看看uuid是啥 定义与概念 UUID 是 Universally Unique Identifier 的缩写&#xff0c;即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符&#xff0c;在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系…

Linux之安装MySQL

1、查看系统当前版本是多少位的 getconf LONG_BIT2.去官网下载对应的MYSQL安装包 这里下载的是8版本的&#xff0c;位数对应之前的64位 官网地址&#xff1a;https://downloads.mysql.com/archives/community/ 3.上传压缩包 4.到对应目录下解压 tar -xvf mysql-8.0.26-lin…

【NLP 20、Encoding编码 和 Embedding嵌入】

目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码&#xff08;One-Hot Encoding&#xff09; (2) 位置编码&#xff08;Positional Encoding&#xff09; (3) 标签编码&#xff08;Label Encoding&#xff09; (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri &#xff08;Environmental Systems Research Institute&#xff09;公司开发的下一代桌面地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…

初学 Xvisor 之理解并跑通 Demo

官网&#xff1a;https://www.xhypervisor.org/ quick-start 文档&#xff1a;https://github.com/xvisor/xvisor/blob/master/docs/riscv/riscv64-qemu.txt 零、Xvisor 介绍 下面这部分是 Xvisor 官方的介绍 Xvisor 是一款开源的 Type-1 虚拟机管理程序&#xff0c;旨在提供一…

“AI智能分析综合管理系统:企业管理的智慧中枢

在如今这个快节奏的商业世界里&#xff0c;企业面临的挑战越来越多&#xff0c;数据像潮水一样涌来&#xff0c;管理工作变得愈发复杂。为了应对这些难题&#xff0c;AI智能分析综合管理系统闪亮登场&#xff0c;它就像是企业的智慧中枢&#xff0c;让管理变得轻松又高效。 过去…

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…

Hugging Face 的研究人员正致力于打造 OpenAI 深度研究工具的“开源版

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Java进阶(JVM调优)——阿里云的Arthas的使用 安装和使用 死锁查找案例,重新加载案例,慢调用分析

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM调优的工具阿里云的Arthas的使用&#xff0c;安装和使用&#xff0c;命令的使用案例&#xff1b;死锁查询的案例&#xff1b;重新加载一个类信息的案例&#xff1b;调用慢的分析案…

通过docker安装部署deepseek以及python实现

前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…