力扣hot100——第5天:22括号生成、23合并K个升序链表、31下一个排列

news2024/9/27 19:27:23

文章目录

  • 1.22括号生成
    • 1.1.题目
    • 1.2.题解
  • 2.23合并K个升序链表
    • 2.1.题目
    • 2.2.解答
  • 3.31下一个排列
    • 3.1.题目
    • 3.2.解答

1.22括号生成

参考:力扣题目链接;题解1,题解2

1.1.题目

在这里插入图片描述

1.2.题解

这道题目是使用递归的方法来求解,因为要求解所有的括号的可能情况,所以必须使用递归的方法来收集结果,而不能使用动态规划的方法。

做这道题目也可以大概理解什么时候要用回溯/动态规划的方法,就是要求所有的可能的时候,每个位置都有一种可能的选择,这个位置选了不同的结果,那么他也会影响后面的位置的选择。其实这个就是递归回溯算法来求解,或者动态规划来求解。

比如这道题使用递归回溯的方法来求解,其实就是一个树,当前节点选择不同的元素,得到的就是树中的不同节点。不同的当前节点决定了它后面展开的子树也是不同的。为了得到所有的可能,我们就要使用回溯:遍历完当前节点的所有子树之后,回溯算法回到当前节点的位置,然后重新选择当前节点选择的元素,从而得到其他的可能

如下图所示,就展示了这个不同节点导致子树不同、以及回溯到当前位置得到其他的可能的过程。

在这里插入图片描述
所以这道题目的题解如下:

首先要明白,一个合法的结果必须保证 ( 的个数 大于等于 ) 的个数。所以便利到当前位置的时候,可以有两个选择,即(或者),但是有判断条件:

  • 想选(:如果还有剩余的(,那么一定可以放(,因为它只需要等待后面有)来匹配它就行了,结果一定是合法的
  • 想选):如果还有剩余的)(实际上,由于我们都是优先选择(,并且保证(个数大于)的时候才会防止),所以导致这个条件一定是满足的),并且当前传入的字符串中**(的个数大于)的个数**,那么就可以在当前位置加入)

终止条件:当()个数都达到了个数n之后,就收集到了合法的结果,存储起来即可。

最后给出代码如下,和题解中不一样,而是沿用代码随想录中的写法,因为这种写法可以明显的显示出来回溯的过程,而题解的写法则是把这些内容忽略掉了。其实看下面的解答就可以发现,就是代码随想录中回溯算法那章的结果,非常简单。

vector<string> result;   // 最终收集的结果
string path;   // 当前收集的路径

void backtracking(int left, int right, int n)
{
    // 2.回溯终止条件:左右括号都收集满了
    if(left == n && right == n)
    {
        result.push_back(path);
        return;
    }

    // 3.开始递归和回溯
    // 3.1.还有剩余的(,那么(是可以无条件放的,都合法,只需要等待后面用)匹配它即可
    if(left < n)   
    {
        path.push_back('(');  // 加入一个(
        backtracking(left+1, right, n);   // 递归,选择后面的括号
        path.pop_back();   // 回溯,把上面加入的(弹出
    }
    // 3.2.还有剩余的), 并且当前已有的(个数 > 已有的)个数,那么可以加入)
    if(right < n && left > right)
    {
        path.push_back(')');   // 加入一个)
        backtracking(left, right+1, n);
        path.pop_back();   // 回溯,把上面加入的)弹出
    }
}

vector<string> generateParenthesis(int n)
{
    backtracking(0, 0, n);
    return result;
}

2.23合并K个升序链表

参考:力扣题目链接;参考题解

2.1.题目

在这里插入图片描述

2.2.解答

其实这道题目和昨天的合并两个升序链表思路基本是相同的,只不过由于有多个链表,所以代码中寻找当前位置的最小节点的时候需要一个for循环来判断所有的节点,从而寻找一个最小的节点。

另外最外面遍历链表到非空的大循环也不能使用两个链表都不是空来判断了,因为现在有多个链表,其中一个为空之后,其他的如果都不为空,那么都可以继续遍历,而不能直接退出。所以这里需要一个死循环,然后在循环里面判断当前选择的节点,如果当前没有选择到有效节点,说明所有的链表都是空了,则说明所有的链表都遍历完毕了,可以跳出循环了。

最后给出代码如下, 其实还是很简单的,和昨天两个链表的题目差不多。

ListNode *mergeKLists(vector<ListNode *> &lists)
{
    int size = lists.size();  // 所有链表的个数
    ListNode* dummy = new ListNode(0);  // 新建结果链表,使用虚拟头指针
    ListNode* cur = dummy;

    while(true)
    {
        // 记录本次选择的最小节点的指针,和对应于vector中是哪条链表的节点
        ListNode* min_node = nullptr;
        int list_index = -1; 
        for(int i = 0; i < size; i++)
        {
            // 如果这条链表已经遍历到头了,那么不需要对比了
            if(lists[i] == nullptr)
                continue;
            // 运行到这里,说明这条链表还没有遍历完
            // 如果是第一次寻找当前位置的最小节点,则赋值min_node和list_index
            // 否则不是第一次,则如果当前节点值更小,则更新min_node和list_index
            if(min_node == nullptr || lists[i]->val < min_node->val)
            {
                min_node = lists[i];
                list_index = i;
            }
        }

        // 如果当期位置没有找到最小节点,说明所有链表都遍历完毕了,则直接跳出while循环
        if(min_node == nullptr)
            break;
        
        // 运行到这里,说明当前位置找到了最小节点,则先赋值、再后移节点
        cur->next = min_node;   // 赋值当前节点的下一个位置
        cur = cur->next;   // 移动当前节点到下一个位置
        lists[list_index] = lists[list_index]->next;  // 移动链表中的节点
    }

    ListNode* res = dummy->next;
    delete dummy;
    return res;
}

3.31下一个排列

参考:力扣题目链接;参考题解

3.1.题目

在这里插入图片描述

3.2.解答

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

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

相关文章

这个macOS神器,让爱怀旧的人直呼:“爷青回!”

写在前面 Hello&#xff0c;大家好&#xff0c;我们又见面了。 停止更新了两周多&#xff0c;本来打算荒废这个CSDN的&#xff0c;但对写文章的热爱又逼着我继续写…… 这次我们要推荐一个macOS神器&#xff0c;叫“Aqua Menu Bar”。 以后永远不写水文了&#xff0c;告别CS…

AJAX异步请求解决跨域问题的三种方式

一 什么是跨域 出于浏览器的同源策略限制。同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的…

移动应用测试场景的五个重点

移动应用程序测试在移动开发生命周期中至关重要。开发人员和应用程序测试人员在上线之前应该考虑不同的移动应用程序测试场景。考虑到每天发布的应用程序数量&#xff0c;这一点尤为重要。根据 Statista 的数据&#xff0c;2020 年全球移动应用下载量已增至 2180 亿次。这导致了…

通过.sh文件快捷部署jar包到服务器上

参考博客&#xff1a;https://blog.csdn.net/qq_43382350/article/details/125008727 直接写一个脚本文件&#xff0c;每次运行这个文件就可以通过.sh文件快捷部署jar包到服务器上。 在合适的文件夹下创建脚本文件 vim start.sh 内容如下(三个jar包分别放置在a1、a2、a3文件夹…

SAR雷达系统反设计及典型目标建模与仿真实现研究——目标生成与检测(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

白话强化学习(理论+代码)

文章目录前言强化学习概述案例alphaGo无人驾驶why强化学习特点基本理论部分基本概念马尔可夫模型马尔可夫链案例马尔科夫决策过程累计回报概念及其求取流程案例算法目的Q-Leaning真实值与预测值案例离线学习Sarsa选择动作函数代码DQN流程预估“表”与实际“表”编码坑点环境修改…

你的业务代码中Spring声明式事务处理正确了吗?

Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API(JPA) 等事务 API&#xff0c;实现了一致的编程模型&#xff0c;而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式&#xff0c;配合 Spring Boot 的自动配置&#xff0c;大多数 S…

试剂的制备丨艾美捷逆转录病毒定量试剂盒方案

QuickTiter逆转录病毒定量试剂盒提供了一种测定逆转录病毒滴度的快速方法。该测定法测量逆转录病毒的病毒核酸含量&#xff0c;可以在纯化病毒之前或之后进行。 Cell Biolabs艾美捷QuickTiter™ 逆转录病毒定量试剂盒不涉及细胞感染&#xff1b;相反&#xff0c;它专门测量纯化…

Linux | 可重入函数 | volatile | SIGCHLD信号

文章目录可重入函数volatilevolatile和const同时修饰变量SIGCHLD信号可重入函数 当一个函数可以被两个流调用&#xff0c;我们称该函数具有重入特征 如果一个函数被重入后可能导致内存泄漏的问题&#xff0c;我们称该函数为不可重入函数&#xff0c;反之&#xff0c;一个函数…

BER转Q

BER转Q Q(2^0.5)*erfcinv(2*BER) Q_dB20*log10(Q) 1、为什么要这样转&#xff1a; 暂时我也不知道&#xff0c;知道了再来补 2、关于erfcinv&#xff1a; yerf(x) 误差函数 yerfc(x) 互补误差函数 yerfinv(x) 逆误差函数(误差函数的反函数) yerfcinv(x) 逆互补误差函数(互补误差…

测试网络、磁盘使用情况和最大性能

1、测最大网络带宽&#xff0c;当前流量 查看网卡信息&#xff1a;ethtool p2p1 最简单的方法是用scp复制一个大文件&#xff0c;例如50G&#xff0c;复制时间要长&#xff0c;至少30分钟。之前在数据库迁移时&#xff0c;发现网速对迁移速度导致了重大影响&#xff0c;我们的…

基于go-micro微服务的实战-Gateway网关层的限流降级(八)

基于go-micro微服务的实战-Gateway网关层的限流降级(八) 文章最后附带完整代码 这一节主要是在Gateway网关层&#xff0c;基于go-micro的装饰器引入限流和降级。限流降级用的是开源库hystrix,类似java的hystrix&#xff0c;这里不做具体介绍和使用&#xff0c;可自行查看文档。…

车载ECU嵌入式设备的诊断测试 – DTC

作者 | 李伟 上海控安安全测评中心安全测评部总监 来源 | 鉴源实验室 01 DTC-Diagnostic Trouble Code&#xff08;诊断故障代码&#xff09; 车辆在运行的过程当中&#xff0c;控制器会监控状态&#xff0c;特定故障发生时控制器会记录这些故障。车辆送4S店进行维修保养时&…

Numpy入门[4]——数组类型

Numpy入门[4]——数组类型 参考&#xff1a; https://ailearning.apachecn.org/ 使用Jupyter进行练习 import numpy as np之前已经看过整数数组和布尔数组&#xff0c;除此之外还有浮点数数组和复数数组。 复数数组 a np.array([1 1j , 2 , 3 , 4]) aarray([1.1.j, 2.0.j, …

Java基于PHP+MySQL干洗店管理系统的设计与实现

干洗店管理系统是信息时代的产物,它是干洗店管理的一个好帮手。有了它不再需要繁重的纸质登记,有了它干洗店管理员不在需要繁重的工作,一些收费标准和干洗业务等基本信息可以由管理人员及时的对信息进行查询、更新、修改和删除,方便简易,且时效性高。 干洗店管理系统是一个典型…

java 中使用BigDecimal 解决科学计数法问题

一 BigDecimal的Api 1.1 常用方法介绍 ROUND_CEILING 向正无穷方向舍入 ROUND_DOWN 向零方向舍入 ROUND_FLOOR 向负无穷方向舍入 ROUND_HALF_DOWN 向&#xff08;距离&#xff09;最近的一边舍入&#xff0c;除非两边&#xff08;的距离&#xff09;是相等,如果是…

在python 深度学习Keras中计算神经网络集成模型

神经网络的训练过程是一个挑战性的优化过程&#xff0c;通常无法收敛。最近我们被客户要求撰写关于深度学习的研究报告&#xff0c;包括一些图形和统计输出。 这可能意味着训练结束时的模型可能不是稳定的或表现最佳的权重集&#xff0c;无法用作最终模型。 解决此问题的一种…

MyBatis-Plus

MyBatis-Plus 1、简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 润物无声 只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;…

数据结构学习笔记(Ⅷ):排序

目录 1 排序基础 1.1 排序的基本概念 2 排序算法 2.1 插入排序 1.思想 2.实现 3.效率分析 4.优化 2.2 希尔排序 1.定义 2.实现 3.效率分析 3 交换排序 3.1 冒泡排序 1.定义 2.实现 3.效率分析 3.2 快速排序 1.算法思想 2.实现 3.效率分析 4 选择排序 4.…

第4章 SpringBoot与Web应用

文章目录第4章 SpringBoot与Web应用4.1 配置Tomcat运行4.2 https安全访问4.3 数据验证4.4 配置错误页4.5 全局异常处理4.6 文件上传4.6.1 基础上传4.6.2 上传文件限制4.6.3 上传多个文件4.7 拦截器4.8 AOP拦截器4.9 本章小结4.9 本章小结第4章 SpringBoot与Web应…