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

📝前言说明:

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

🎬个人简介:努力学习ing

📋本专栏:C++刷题专栏

📋其他专栏:C语言入门基础python入门基础C++学习笔记Linux

🎀CSDN主页 愚润泽

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

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

题目

  • [206. 反转链表](#206. 反转链表)
  • [24. 两两交换链表中的节点](#24. 两两交换链表中的节点)
  • [50. Pow(x, n)](#50. Pow(x, n))

206. 反转链表

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

个人解

思路:

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

屎山代码:

cpp 复制代码
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 就是反转后链表的末尾,让末尾指向head
        head->next = nullptr;
        return newnode;
    }
};

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


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

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/

个人解

思路:

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

屎山代码:

cpp 复制代码
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

屎山代码(没通过):

cpp 复制代码
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);
        else
            return myPow(x, n + 1) / x;
    }
};

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


优质解

思路:

快速幂:

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

代码:

cpp 复制代码
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)


🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
m0_6896182814 分钟前
从海洋生物找灵感:造个机器人RoboPteropod,它能在水下干啥?
笔记·机器人
June`18 分钟前
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
c++·算法·深度优先·剪枝
vlln25 分钟前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
我叫珂蛋儿吖40 分钟前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存
yxc_inspire1 小时前
基于Qt的app开发第七天
开发语言·c++·qt·app
冲帕Chompa1 小时前
图论part09dijkstra算法
算法·图论
·云扬·1 小时前
【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
redis·算法·lua
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
zkmall1 小时前
推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略
算法·机器学习·推荐算法
龙湾开发2 小时前
轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API
人工智能·笔记·学习·机器学习·mnn