算法与数据结构之递归

news/2024/6/27 4:37:52 标签: 算法, 数据结构

要点

  • 搞清楚递归函数的作用
  • 处理当前状态和下一递归状态的关系
  • 处理好递归的出口

举例

  • 反转链表
    • 当前递归函数的作用:反转链表,并返回新的头结点。
    • 当前状态和下一递归状态的关系:递归调用ReverseList(head.next),函数会返回新的头结点,我们需要处理好当前状态和下一状态的关系。
    • 递归的出口:如果head或者head.next为null,直接返回head;
    • 代码
   public class Solution {
       public ListNode ReverseList(ListNode head) {
           if (head == null || head.next == null) {
               return head;
           }
           ListNode newHead = ReverseList(head.next);
           // 处理状态
           head.next.next = head;
           head.next = null;
           return newHead;
       }
   }
  • 最近公共节点
    • 当前递归函数的作用:返回最近公共节点
    • 当前状态和下一递归状态的关系:判断lowestCommonAncestor(root.left)lowestCommonAncestor(root.right)是否为null。如果两个都不为null,则返回当前节点;如果某一个为null,返回另一个节点;
    • 递归的出口:root为null或者root等于left或者root等于right;
    • 代码
  class Solution {
      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode o1, TreeNode o2) {
          if (root == null || root == o1 || root == o2) {
              return root;
          }
          TreeNode left = lowestCommonAncestor(root.left, o1, o2);
          TreeNode right = lowestCommonAncestor(root.right, o1, o2);
          if (left != null && right != null) {
              return root;
          }
          if (left != null) {
              return left;
          }
          if (right != null) {
              return right;
          }
          return null;
      }
  }
  • 最小的K个数
    • 当前递归函数的作用:排序前k个数,即在(left, right)范围,将key = arr[left]放置到合适的位置,使得左边的值都小于key,右边的值都大于key;
    • 当前状态和下一状态的关系:(left, i - 1)都是小于等于key,(i + 1, right)都是大于等于key。如果当前下标i等于k - 1,则可以直接return;如果当前下标i大于k - 1,则需要调用helper(arr, left, i - 1);如果当前下标小于k - 1,则递归调用helper(arr, i + 1, right)
    • 递归的出口:left < right;
    • 代码
public class Solution {
    private void quickSortImporvment(int[] nums, int left, int right, int k) {
        if (left < right) {
            int randomIndex = new Random().nextInt(right - left + 1) + left;
            swap(nums, left, randomIndex);
            int i = left, j = right, key = nums[i];
            while (i < j) {
                while (i < j && nums[j] >= key) {
                    j--;
                }
                if (i < j) {
                    nums[i] = nums[j];
                }
                while (i < j && nums[i] <= key) {
                    i++;
                }
                if (i < j) {
                    nums[j] = nums[i];
                }
            }
            nums[i] = key;
            if (i == k - 1) {
                return ;
            } else if (i > k - 1) {
                quickSortImporvment(nums, left, i - 1, k);
            } else {
                quickSortImporvment(nums, i + 1, right, k);
            }
        }
    }

    private void swap(int[] arr, int index1, int index2) {
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
}

http://www.niftyadmin.cn/n/860442.html

相关文章

算法与数据结构之二分查找

要点 找出判断的条件何时退出循环 举例 无重复数字的普通二分查找 找出判断的条件&#xff1a;用arr[mid]和target去比较。如果arr[mid] target时&#xff0c;返回mid&#xff1b;如果arr[mid] > target时&#xff0c;说明要找的值在左边&#xff0c;right mid - 1&…

Hive与数据仓库

Hive Hive主要实现了两个功能&#xff1a; 提供了一个存储和管理元数据的HiveMetastore&#xff0c;以库和表的形式管理HDFS中的元数据。实现了一套将SQL转换为MapReduce程序的执行引擎。 Hive执行原理 所有的命令和查询都会进入Driver&#xff08;驱动模块&#xff09;&#…

基于MapReduce的WordCount

MapReduce是一种编程模型&#xff0c;将任务分为两个阶段&#xff1a;Map和Reduce&#xff0c;用户只需编写map()和reduce()两个函数就可以完成简单的分布式程序的设计。 MapReduce能够解决的问题有一个共同特点&#xff1a;任务可以被分解成多个子问题&#xff0c;且这些子问题…

MySQL给表添加create_time和update_time字段并且设置触发器

如何实现 SQL ALTER TABLE <表名> ADD COLUMN create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER <create_time前一个字段>, ADD COLUMN update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER create_time;S…

算法与数据结构笔记

文章目录算法动态规划算法递归算法回溯算法搜索算法分治算法与树有关位运算二分查找单调栈单调队列滑动窗口并查集随机化算法双指针排序算法模拟数学数据结构位图二叉树链表图论正则匹配表达式求值模板算法 动态规划算法 关键点 &#xff08;求最值&#xff0c;有重叠子问题…

数据仓库系列文章整理

声明&#xff1a;此系列文章来自http://webdataanalysis.net/category/web-data-warehouse/ 数据仓库的价值 相信大家都了解数据仓库的4个基本特征&#xff1a;面向主题的、集成的、相对稳定的、记录历史的&#xff0c;而数据仓库的价值正是基于这4个特征体现的&#xff1a; 1…

Canal笔记

进入mysql&#xff0c;输入show variables like bin_log查看是否开启binlog如果没有&#xff0c;则在/etc/my.cnf文件中添加如下内容 [mysqld]server-id 1log-bin mysql-binbinlog_format row3.重启mysql&#xff0c;sudo service mysql restart 4.输入show variables like bin…

Scala集合操作

Scala集合操作 Seq 数组类型 Array 是什么 Array是一个长度不可变的序列&#xff0c;在底层是用Java的数组存储&#xff0c;存在于scala.collection.immutable包中&#xff0c;会自动导入 定义 // 该方法实际调用了的伴生对象的apply方法&#xff0c;从而省去了new关键字 va…