递归、搜索与回溯(二)——递归练习与快速幂

文章目录

递归、搜索与回溯------递归

该文仍然是解决递归问题,值得注意的是快速幂算法。接下来会系统学习二叉树深搜题目,慢慢走向搜索与回溯。

两两交换链表中的节点

原题链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

先模拟一下示例1:

按照题目要求,结点1和结点2需要交换,由于题目要求只能通过更改指针指向来进行交换操作,所以结点2的next指针一定需要指向结点1,此时整个链表就被分割为两个独立的链表了,即结点3找不到。所以,我们需要先对后面的结点进行交换操作,结点4的next指针一定需要指向结点3,此时结点4和结点3相当于已经交换完毕了,此时要对结点1和结点2进行交换并将其加入到结点4和结点3链表中,结点2的next指针要指向结点1,结点1的next结点要指向结点4。

与反转链表有相似之处,都需要"后序遍历",不断将前面的结点加入完成任务的链表中,不同之处在于,该题目每次要将交换后的两个结点加入完成任务的链表中。

将递归方法看作一个黑盒子,它要完成的任务就是:将head以及其后的结点构成的链表进行相邻交换并按要求拼接。

当链表为null或者最后一个结点单独存在(没有与之相邻的结点,例如1->2->3->4->5的结点5就是单独存在的结点)直接返回即可。

以宏观的方式编写递归代码:

java 复制代码
class Solution {
    public ListNode swapPairs(ListNode head) {
        //begin
        if(head == null || head.next == null) {
            return head;
        }
        ListNode ret = swapPairs(head.next.next);
        ListNode tmp = head.next;
        head.next.next = head;
        head.next = ret;
        return tmp;
        //end
    }
}

Pow(x, n)

原题链接:50. Pow(x, n) - 力扣(LeetCode)

该题目采用暴力方法无法解决,因为当 n 的绝对值过大暴力解法会很慢。这里引入快速幂 的算法,用来快速计算Pow问题,具体思路为:

计算x^n时,先计算x^(n/2),此时x^n = x^(n/2) * x^(n/2),而计算x^(n/2)时,先计算x^(n/2/2)x^(n/2) = x^(n/2/2) * x^(n/2/2),依次类推,直到化简为求x^0再逐层返回,实现了从O(N)O(logN)。不过,其中要注意的是,n不全为偶数,当n为奇数时,x^n = x^(n/2) * x^(n/2) * x。例如,求4^7(此时n = 7不是偶数),先求4^34^7 = 4^3 * 4^3 * 4,求4^3,先求4^14^3 = 4^1 * 4^1 * 4......

题目可能会出现 n 为负数的情况,只需要先求x^(-n),即求x的n的绝对值次幂,再用 1 除 该结果即可。

代码如下:

java 复制代码
class Solution {
    private double _myPow(double x, int n) {
        if(n == 0) {
            return 1;
        }
        double tmp = _myPow(x, n / 2);
        return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;
    }
    public double myPow(double x, int n) {

        double ret = _myPow(x, Math.abs(n));
        if(n < 0) {
            return 1 / ret;
        }else {
            return ret;
        }
    }
}

相关推荐
Kuo-Teng15 小时前
LeetCode 279: Perfect Squares
java·数据结构·算法·leetcode·职场和发展
王哈哈^_^15 小时前
YOLO11实例分割训练任务——从构建数据集到训练的完整教程
人工智能·深度学习·算法·yolo·目标检测·机器学习·计算机视觉
檐下翻书17315 小时前
从入门到精通:流程图制作学习路径规划
论文阅读·人工智能·学习·算法·流程图·论文笔记
CoderYanger16 小时前
B.双指针——3194. 最小元素和最大元素的最小平均值
java·开发语言·数据结构·算法·leetcode·职场和发展·1024程序员节
小曹要微笑17 小时前
STM32各系列时钟树详解
c语言·stm32·单片机·嵌入式硬件·算法
前进的李工18 小时前
LeetCode hot100:094 二叉树的中序遍历:从递归到迭代的完整指南
python·算法·leetcode·链表·二叉树
麦麦大数据19 小时前
F049 知识图谱双算法推荐在线学习系统vue+flask+neo4j之BS架构开题论文全源码
学习·算法·知识图谱·推荐算法·开题报告·学习系统·计算机毕业设计展示
兩尛19 小时前
215. 数组中的第K个最大元素
数据结构·算法·排序算法
9523619 小时前
数据结构-堆
java·数据结构·学习·算法
吃着火锅x唱着歌19 小时前
LeetCode 面试题 16.24.数对和
算法·leetcode·职场和发展