当前位置: 首页 > news >正文

【递归、搜索与回溯】专题一:递归(二)

📝前言说明:

  • 本专栏主要记录本人递归,搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行该专题内不同子专题的学习

点击链接开始学习
导论递归 (一) 、递归 (二)
二叉树的深搜穷举 vs 暴搜 vs 深搜
回溯 vs 剪枝综合练习
FloodFill算法记忆化搜索

题目

  • 206. 反转链表
    • 个人解
  • 24. 两两交换链表中的节点
    • 个人解
  • 50. Pow(x, n)
    • 个人解
    • 优质解


206. 反转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/description/

在这里插入图片描述

个人解

思路:

  • 子问题:给一个链表头结点,逆序之后,返回逆序后的头结点
  • 函数体:先反转当前节点之后的链表,然后再把当前节点连接在链表的后面
  • 递归出口:当当前没有节点或者只剩一个节点

屎山代码:

class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* newnode = reverseList(head -> next);head->next->next = head; // head->next 就是反转后链表的末尾,让末尾指向headhead->next = nullptr;return newnode;}
};

这道题,也可以改成循环,用双指针解决。


24. 两两交换链表中的节点

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
在这里插入图片描述

个人解

思路:

  • 子问题:给你一个头结点,帮我将头结点对应链表的节点两两交换(子问题其实是先通过分析问题后得出来的),然后返回交换后的头结点
  • 函数体:将head和head->next交换,然后链接函数的返回结果(后面链表交换好的结果)
  • 递归出口:当只有 0 / 1个节点

屎山代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode* head2 = head->next;head -> next = swapPairs(head2->next);head2 -> next = head;return head2;}
};

50. Pow(x, n)

题目链接:https://leetcode.cn/problems/powx-n/description/
在这里插入图片描述

个人解

思路:

  • 子问题:
    • n > 0 :x * x的 n - 1次幂
    • n < 0 :x 的 n + 1 次幂 / x
  • 函数体:x * pow(x, n - 1) 或者 pow(x, n + 1) / x
  • 返回值:当 n == 0 return 1

用时:3:00
屎山代码(没通过):

class Solution {
public:double myPow(double x, int n) {if(n == 0) return 1.0;else if(n > 0)return x * myPow(x, n - 1);elsereturn myPow(x, n + 1) / x;}
};

时间复杂度:O (n)
空间复杂度:O(n)


优质解

思路:

快速幂:

  • 子问题:求出 x 的 n 次⽅是多少,然后返回
  • 先求出 x 的 n / 2 次方是多少,然后根据 n 的奇偶,得出 x 的 n 次方是多少
  • 当 n 为 0 的时候,返回 1
  • 还要注意,负数可能会溢出

代码:

class Solution
{
public:double myPow(double x, int n) {// x 的 -n 次幂,就是 1 / x 的 n 次幂return n < 0 ? 1.0 / pow(x, -(long long)n) : pow(x, n);}double pow(double x, long long n){if(n == 0) return 1.0;double tmp = pow(x, n / 2);return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;}
};

时间复杂度:O(log n)
空间复杂度:O(log n)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.xdnf.cn/news/427123.html

相关文章:

  • electron 基础知识
  • 软考软件评测师——计算机组成与体系结构(分级存储架构)
  • 当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?
  • 项目中会出现的css样式
  • MQTT协议详解:物联网通信的轻量级解决方案
  • JMeter同步定时器 模拟多用户并发访问场景
  • Qt进阶开发:QTcpSocket的详解
  • Leetcode 3542. Minimum Operations to Convert All Elements to Zero
  • APISQL免费版安装教程(视频)
  • java刷题基础知识
  • 【Folium】使用离线地图
  • 我的MCP相关配置记录
  • Cursor 编辑器 的 高级使用技巧与创意玩法
  • JavaScript异步编程 Async/Await 使用详解:从原理到最佳实践
  • 基于RT-Thread的STM32F4开发第三讲——DAC
  • 基于TI AM6442+FPGA解决方案,支持6网口,4路CAN,8个串口
  • 《ffplay 读线程与解码线程分析:从初始化到 seek 操作,对比视频与音频解码的差异》
  • Vue 3.5 :新特性全解析与开发实践指南
  • MQTT 协议详解:物联网通信的利器
  • 【Unity】WebGL开发问题汇总
  • 专栏项目框架介绍
  • 【Redis】谈谈Redis的设计
  • 网安学途—流量分析 attack.pcap
  • 【TS入门笔记8---了解JSX】
  • G1在GC的时候会占用内存吗?占用的是分配的内存还是分配外的内存
  • JS Map使用方法
  • Linux上的rm和srm 命令
  • Femap许可网络配置
  • MRI、DX、CT 医学影像常用术语详解:概念与应用
  • 在Babylon.js中实现完美截图的艺术:包含Canvas和HTML覆盖层