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

文章目录

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

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

两两交换链表中的节点

原题链接: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;
        }
    }
}

相关推荐
玉树临风ives几秒前
atcoder ABC 453 题解
数据结构·c++·算法·图论·atcoder
田梓燊5 分钟前
leetcode 48
算法·leetcode·职场和发展
mmz120710 分钟前
深度优先搜索DFS2(c++)
c++·算法·深度优先
米粒112 分钟前
力扣算法刷题 Day 38 (打家劫舍专题)
算法·leetcode·职场和发展
Robot_Nav17 分钟前
RC-ESDF与Lazy Theta* 算法结合进行离线全局路径的生成
算法·全局规划·esdf
papership18 分钟前
【入门级-算法-7、搜索算法:深度优先搜索】
算法·深度优先
山甫aa32 分钟前
哈希集合-----从零开始的数据结构学习
数据结构·算法·哈希算法
say_fall34 分钟前
有关算法的简单数学问题
数据结构·c++·算法·职场和发展·蓝桥杯
Halo_tjn35 分钟前
Java 接口的定义重构学生管理系统
java·开发语言·算法
阿Y加油吧41 分钟前
栈的经典应用:从「有效括号」到「寻找两个正序数组的中位数」深度解析
开发语言·python·算法