递归搜索与回溯算法--递归(2)

递归搜索与回溯算法

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

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

示例 2:

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

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

解法(递归):

算法思路:

  1. 递归函数的含义:交给你⼀个链表的头指针,你帮我逆序之后,返回逆序后的头结点;
  2. 函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后⾯即可;
  3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤逆序,直接返回。

代码如下:

C++ 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
        {
            return head;
        }
        ListNode*newHead=reverseList(head->next);
        head->next->next=head;
        head->next=nullptr;
        return newHead;
    }
    
};

两两交换链表中的节点

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

示例 1:

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

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

解法(递归):

算法思路:

  1. 递归函数的含义:交给你⼀个链表,将这个链表两两交换⼀下,然后返回交换后的头结点;
  2. 函数体:先去处理⼀下第⼆个结点往后的链表,然后再把当前的两个结点交换⼀下,连接上后⾯处 理后的链表;
  3. 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤交换,直接返回

代码如下:

C++ 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
        {
            return head;
        }
        auto tmp=swapPairs(head->next->next);
        auto ret=head->next;
        head->next->next=head;
        head->next=tmp;
        return ret;
    }
};

POW(X,N)

实现 pow(x , n) ,即计算 x 的整数 n 次幂函数(即,xn )。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • n 是一个整数
  • 要么 x 不为零,要么 n > 0
  • -104 <= xn <= 104

解法(递归-快速幂):

算法思路:

  1. 递归函数的含义:求出 x 的 n 次⽅是多少,然后返回;
  2. 函数体:先求出 x 的 n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x 的 n 次⽅是多少;
  3. 递归出⼝:当 n 为 0 的时候,返回 1 即可。

代码如下:

C++ 复制代码
class Solution {
public:
    double myPow(double x, int 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;
    }
};
  1. 递归函数的含义:求出 x 的 n 次⽅是多少,然后返回;
  2. 函数体:先求出 x 的 n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x 的 n 次⽅是多少;
  3. 递归出⼝:当 n 为 0 的时候,返回 1 即可。

代码如下:

C++ 复制代码
class Solution {
public:
    double myPow(double x, int 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;
    }
};
相关推荐
weixin_4786897615 分钟前
【121. 买卖股票的最佳时机】——贪心算法/动态规划
算法·贪心算法·动态规划
武昌库里写JAVA35 分钟前
mysql 几种启动和关闭mysql方法介绍
java·开发语言·算法·spring·log4j
我是聪明的懒大王懒洋洋1 小时前
力扣力扣力:53.最大子数组和
算法·leetcode·职场和发展
doll ~CJ1 小时前
定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)
c++·qt·计时器与随机数生成器运用·图片循环播放
豆豆1 小时前
如何选择企业网站模版来搭建网站?
服务器·开发语言·前端·php·软件构建
吃葡萄不图葡萄皮1 小时前
3D绘制动态爱心Matlab
开发语言·matlab
九圣残炎1 小时前
【从零开始的LeetCode-算法】3345. 最小可整除数位乘积 I
java·算法·leetcode
星晨羽1 小时前
esayExcel根据模板导出包含图片
java·开发语言·windows
Say Bay To The Bugs1 小时前
EasyExcel 使用多线程按顺序导出数据
开发语言·excel
机器懒得学习1 小时前
Python & PyQt5 实现 .his 文件批量转 Excel 工具
开发语言·python·excel