算法基础四

括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:

示例 1:
输入:n = 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例 2:
输入:n = 1 输出:[“()”]

解题思路:回溯算法。这一类问题是在一棵隐式的树上求解,可以用深度优先遍历,也可以用广度优先遍历。一般用深度优先遍历。原因是:1.代码好写,使用递归的方法,直接借助系统栈完成状态的转移;2.广度优先遍历得自己编写结点类和借助队列。

   public List<String> generateParenthesis(int n) {List<String> res = new ArrayList<>();if (n == 0) {return res;}// 执行深度优先遍历,搜索可能的结果dfs("", n, n, res);return res;}/*** @param curStr 当前递归得到的结果* @param left   左括号还有几个可以使用* @param right  右括号还有几个可以使用* @param res    结果集*/private void dfs(String curStr, int left, int right, List<String> res) {// 因为每一次尝试,都使用新的字符串变量,所以无需回溯// 在递归终止的时候,直接把它添加到结果集即可,注意与「力扣」第 46 题、第 39 题区分if (left == 0 && right == 0) {res.add(curStr);return;}// 剪枝(如图,左括号可以使用的个数严格大于右括号可以使用的个数,才剪枝,注意这个细节)if (left > right) {return;}if (left > 0) {dfs(curStr + "(", left - 1, right, res);}if (right > 0) {dfs(curStr + ")", left, right - 1, res);}}

合并K个升序链表

给定一个链表数组,每个链表都已经按升序排列。请将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2: 输入:lists = [] 输出:[]
示例 3: 输入:lists = [[]] 输出:[]

解题思路:借助分治的思想,把K个有序链表两两合并即可。

 public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) {return null;}ListNode ans = null;for (int i = 0; i < lists.length; ++i) {ans = mergeTwoLists(ans, lists[i]);}return ans;}public ListNode mergeTwoLists(ListNode a, ListNode b) {if (a == null || b == null) {return a != null ? a : b;}ListNode head = new ListNode(0);ListNode tail = head, aPtr = a, bPtr = b;while (aPtr != null && bPtr != null) {if (aPtr.val < bPtr.val) {tail.next = aPtr;aPtr = aPtr.next;} else {tail.next = bPtr;bPtr = bPtr.next;}tail = tail.next;}tail.next = (aPtr != null ? aPtr : bPtr);return head.next;}

两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:
在这里插入图片描述

输入:head = [1,2,3,4] 输出:[2,1,4,3]

示例 2: 输入:head = [] 输出:[]

示例 3: 输入:head = [1] 输出:[1]

  public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode next = head.next;head.next = swapPairs(next.next);next.next = head;return next;}

K个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]
示例 2: 输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5]

解题思路:要求k个相邻的元素翻转链表
步骤分解:

  1. 链表分区为已翻转部分+待翻转部分+未翻转部分
  2. 每次翻转前,要确定翻转链表的范围,这个必须通过 k 次循环来确定
  3. 需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来
  4. 初始需要两个变量 pre 和 end,pre代表待翻转链表的前驱,end 代表待翻转链表的末尾
  5. 经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next
  6. 翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end 指针,然后进入下一次循环
  7. 特殊情况,当翻转部分长度不足 k 时,在定位end 完成后,end==null,已经到达末尾,说明题目已完成,直接返回即可
public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;ListNode end = dummy;while (end.next != null) {for (int i = 0; i < k && end != null; i++) {end = end.next;}if (end == null) {break;}ListNode start = pre.next;ListNode next = end.next;end.next = null;pre.next = reverse(start);start.next = next;pre = start;end = pre;}return dummy.next;}private ListNode reverse(ListNode head) {ListNode pre = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = pre;pre = curr;curr = next;}return pre;}

删除有序数组中的重复项

给你一个非严格递增排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回nums中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。

解题思路:这里数组的删除并不是真的删除,只是将删除的元素移动到数组的后面,然后返回数组实际剩余的元素个数。

public int removeDuplicates(int[] nums) {if(nums == null || nums.length == 0) {return 0;}int p = 0;int q = 1;while(q < nums.length) {if(nums[p] != nums[q]) {nums[p + 1] = nums[q];p++;}q++;}return p + 1;}

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

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

相关文章

vue2 -- 封装 echarts 基础组件

文章目录 🍉1:传递 option 方式🍍1.1 开发环境🍍1.2 创建基础文件🍍1.3 页面使用 -- 桑基图🍍1.4 旭日图🍍1.5 图形组件 graphic🍍1.6 富文本 rich🍉1:传递 option 方式 🍍1.1 开发环境 echarts^5.0.1vue~2.6.10nodev12.14.0🍍1.2 创建基础文件 创建 sr…

【Qt之QPen】

QPen 类是 Qt 框架中的一个类&#xff0c;用于定义绘制的画笔。 QPen 类的常见属性及函数&#xff1a; 属性&#xff1a; color&#xff1a;画笔颜色width&#xff1a;画笔宽度style&#xff1a;画笔风格capStyle&#xff1a;线帽样式joinStyle&#xff1a;线段连接样式 函…

typescript泛型的基本使用

文章目录 泛型规范一、泛型的作用二、any 和 泛型 的区别1: any类型2: 泛型3: 总结 三、泛型的简单使用1.返回任何类型的泛型函数2.代码示例3.返回指定类型的泛型函数 四、泛型接口&#xff08;1&#xff09;错误代码示范&#xff08;2&#xff09;报错说明&#xff08;3&#…

无脑018——win11部署whisper,语音转文字

1.conda创建环境 conda create -n whisper python3.9 conda activate whisper安装pytorch pip install torch1.8.1cu101 torchvision0.9.1cu101 torchaudio0.8.1 -f https://download.pytorch.org/whl/torch_stable.html安装whisper pip install -U openai-whisper2.准备模型…

【论文阅读】CAN网络中基于时序信道的隐蔽认证算法

文章目录 摘要一、引言和动机A 相关工作 二、背景及实验设置A 以前工作中的时钟偏差和局限性B.最坏到达时间C.安装组件 三、优化流量分配A.问题陈述B.优化帧调度 四、协议和结果A.主协议B.对手模型C. 优化流量和单一发送者的结果D.多发送方情况和噪声信道 摘要 以前的研究工作…

Linux下为可执行文件添加图标

Ubuntu 18.04上使用Qt5.14.2创建一个简单的Qt Widgets项目test&#xff0c;添加2个Push Button按钮&#xff0c;点击分别获取github和csdn地址&#xff0c;在mainwindow.cpp中添加的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h" #inclu…

基于Spring,SpringMVC,MyBatis的校园二手交易网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring,SpringMVC,MyBatis的校园二…

vue项目中实现doc/excel/pdf/txt/图片等文件的预览

vue项目中实现doc/excel/pdf/txt/图片等文件的预览 word预览 1. 使用vue-office-docx&#xff08;只支持docx文件预览&#xff0c;不支持doc文件&#xff09; 支持文档网络地址&#xff08;https://***.docx&#xff09;。 文件上传时预览&#xff0c;此时可以获取文件的Arra…

从零开发短视频电商 在AWS上用SageMaker部署开源模型并用Java SDK调用

文章目录 1.创建AWS账户2.登录AWS3.创建域4.部署模型方式一 使用JumpStart可视化界面部署内置的模型方式二 采用python脚本部署私有模型5.调用模型AWS Java SDK调用Http调用6.监控7.自动扩缩容1.创建AWS账户 需要准备好邮箱一个,支持visa功能的信用卡一个。然后到aws上自己去…

电梯安全远程监控系统解决方案

一、方案背景 随着万丈高楼的平地起&#xff0c;电梯也成为了我们出入高层建筑最常用的工具之一。面对电梯数量的不断增加&#xff0c;电梯安全事故也是相继频发&#xff0c;因此关于电梯的安全运行就越来越受到社会各界的关注。电梯的使用在给人们出入高层建筑带来便利的同时&…

CSS新手入门笔记整理:CSS文本样式

首行缩进&#xff1a;text-in-dent 语法 text-in-dent&#xff1a;像素值; 中文段落首行一般需要缩进两个字的空间。想要实现这个效果&#xff0c;那么textindent值应该是font-size值的2倍。 水平对齐&#xff1a;text-align 语法 text-align&#xff1a;取值; 属性值 说…

分布式ID生成框架Leaf升级踩坑

背景&#xff1a; 在项目中需要一个统一的拿单号等唯一ID的服务&#xff0c;就想起了之前用到的leaf&#xff0c;但是因为项目要求&#xff0c;leaf的版本不符合&#xff0c;需要做一些升级 项目地址&#xff1a;https://github.com/Meituan-Dianping/Leaf 升级点&#xff1…

STM32-(串口通信)

什么是通信&#xff1f; 数据交互信息传递条件&#xff1a;两个端 发送端 一、通信基础知识 1、时钟信号划分 同步通信&#xff1a;通信双方根据同步信号通信&#xff0c;比如双方有一个共同的时钟信号(SPI全双工 I2C半双工) 异步通信&#xff1a;通信双方有自己独立的系统时…

Vue3炫酷可旋转的3D地球

首先&#xff0c;我们需要安装Three.js库&#xff1a; npm install three接下来&#xff0c;我们创建一个Vue3项目&#xff0c;并在项目中引入Three.js库。在src/main.js文件中&#xff0c;编写以下代码&#xff1a; import { createApp } from vue import App from ./App.vu…

【解决方案】基于物联网表计的综合能源管理方案

安科瑞顾强 为加快推进国家“双碳”战略和新型能源体系建设&#xff0c;努力实现负荷准确控制和用户精细化管理&#xff0c;按照“政府主导、电网组织、政企协同、用户实施”的指导原则&#xff0c;多地成立市/县级电力负荷管理中心&#xff0c;包括浙江宁波、慈溪、辽宁大连、…

2312skia,13画布包入门

画矶包快速入门 CanvasKit是用比canvasAPI更高级功能集的Skia来绘画元素到canvas中的wasm模块. 最小应用 此例是个最小Canvaskit应用,它为一帧绘画一个圆角矩形.从unpkg.com中提取wasm二进制文件,但你也可自己构建和管理它. <canvas idfoo width300 height300></c…

Java——》JSONObjet 数据顺序

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Java 普通类和抽象类有哪些区别?

Java 普通类和抽象类有哪些区别&#xff1f; 在Java中&#xff0c;普通类&#xff08;Concrete Class&#xff09;和抽象类&#xff08;Abstract Class&#xff09;是两种不同类型的类&#xff0c;它们有一些关键区别。 普通类&#xff08;Concrete Class&#xff09;&#x…

1_企业架构之LNMP

公司企业架构LNMP(单点服务器部署) 学习目标和内容 1、能够描述项目流程 2、能够了解PV、QPS、DAU等参数 3、能够实现服务器基本环境配置 4、能够部署配置MySQL生产环境 5、能够部署配置Nginx生产环境 6、能够部署配置PHP生产环境 7、能够理解PHP-FPM和Nginx关联关系 8、能够配…

思维模型 逆向思维

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。弱者道之用反者道之动。 1 逆向思维的应用 1.1 历史典故 1 曹冲称象 这个故事讲述的是曹操的儿子曹冲如何利用逆向思维解决了称大象重量的难题。曹冲没有直接去称大象的重量&#xff0c;…