【算法刷题】Day30

news2024/11/17 5:27:00

1. 汉诺塔问题

在这里插入图片描述
原题链接


题干:

在这里插入图片描述
在这里插入图片描述


算法原理:

利用递归算法

将x柱子上的一堆盘子,借助 y柱子,转移到z 柱子上面

递归函数流程:

  1. 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
  2. 递归将 A 中最上面的 n-1 个盘子挪到 B 中
  3. 将 A 中最上面的⼀个盘子挪到 C 中
  4. 将 B 中上面 n-1 个盘子挪到 C 中

代码:

class Solution {
    public void hanota(List<Integer> a, List<Integer> b, List<Integer> c) {
        dfs(a, b, c, a.size());
    }

    public void dfs(List<Integer> a, List<Integer> b, List<Integer> c, int n) {
        if(n == 1) {
            c.add(a.remove(a.size() - 1));
            return;
        }

        dfs(a, c, b, n - 1);
        c.add(a.remove(a.size() - 1));
        dfs(b, a, c, n - 1);
    }
}

2. 合并两个有序链表

在这里插入图片描述

原题链接


题干:

升序 链表
新链表是通过拼接给定的两个链表的所有节点组成的
在这里插入图片描述


算法原理:

  1. 重复子问题(函数头的设计)
    合并两个有序链表

  2. 只关心一个子问题咋做什么(函数体的设计)
    选择两个头结点中较小的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理

  3. 递归的出口
    谁为空返回另一个


代码:

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null) {
            return l2;
        }
        if(l2 == null) {
            return l1;
        }
        if(l1.val <= l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}

3. 反转链表

在这里插入图片描述
原题链接


题干:

单链表的头节点 head ,反转链表,并返回反转后的链表
在这里插入图片描述


算法原理:

利用递归

  1. 从宏观角度
    1)让当前节点后面的链表先逆序,并且把头结点返回
    2)让当前节点添加到逆置后的链表的后面
  2. 将链表看成一棵树
    仅需做一次 dfs 即可
    后序遍历
    在这里插入图片描述

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }

        ListNode newheader = reverseList(head.next);
        head.next.next = head;
        head.next = null;

        return newheader;
    }
}

4. 最大子数组和

在这里插入图片描述
原题链接


题干:

一个整数数组 nums
找出一个具有最大和的连续子数组


算法原理:

1. 状态表示:

dp[i] 表示:以 i 位置为结尾的所有子数组中的最大和
在这里插入图片描述

2. 状态转移方程

在这里插入图片描述
dp[i] = max(nums[i], dp[i - 1] + nums[i])

3. 初始化

  1. 辅助结点里面的值要「保证后续填表是正确的」
  2. 「下标的映射关系」

在这里插入图片描述

4. 填表顺序

从左往右

5. 返回值

整个dp表的最大值


代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n + 1];

        int ret = Integer.MIN_VALUE;
        for(int i = 1; i <= n; i++) {
            dp[i] = Math.max(nums[i - 1], dp[i - 1] + nums[i - 1]);
            ret = Math.max(ret, dp[i]);
        } 
        return ret;
    }
}

5. 环形子数组的最大和

在这里插入图片描述
原题链接


题干:

长度为 n 的环形整数数组 nums
返回 nums 的非空 子数组 的最大可能和


算法原理:

在这里插入图片描述

1. 状态表示:

在这里插入图片描述

2. 状态转移方程

在这里插入图片描述

f[i] = max(nums[i], f[i - 1] + nums[i])
在这里插入图片描述

g[i] = min(nums[i], g[i - 1] + nums[i])

3. 初始化

  1. 辅助结点里面的值要「保证后续填表是正确的」
  2. 「下标的映射关系」
  3. 在这里插入图片描述

4. 填表顺序

从左往右

5. 返回值

  1. 先找到 f 表里面的最大值 -> fmax
  2. 找到 g 表里面的最小值 -> gmin
  3. 统计所有元素的和 -> sum
  4. 返回 sum == gmin ? fmax : max(fmax, sum - gmin)

代码:

class Solution {
    public int maxSubarraySumCircular(int[] nums) {
        int n = nums.length;
        int[] f = new int[n + 1];
        int[] g = new int[n + 1];

        int sum = 0;
        int fmax = Integer.MIN_VALUE;
        int gmin = Integer.MAX_VALUE;
        for(int i = 1; i <= n; i++) {
            int x = nums[i - 1];
            f[i] = Math.max(x, x + f[i - 1]);
            fmax = Math.max(fmax, f[i]);
            g[i] = Math.min(x, x + g[i - 1]);
            gmin = Math.min(gmin, g[i]);
            sum += x;
        }

        return sum == gmin ? fmax : Math.max(fmax, sum - gmin);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spm用于颅骨去除和配准

1. 颅骨去除 出现这个界面就一直等待即可&#xff1a; segment的结果文件中会出现四个文件夹label、mri、report、surf 在mri文件中&#xff0c;mwp1是分割出来的灰质图像&#xff0c;mwp2是分割出来的白质图像&#xff0c;这两图像均是bias correction和空间配准后的。p0**…

Keepalive 解决nginx 的高可用问题

一 说明 keepalived利用 VRRP Script 技术&#xff0c;可以调用外部的辅助脚本进行资源监控&#xff0c;并根据监控的结果实现优先动态调整&#xff0c;从而实现其它应用的高可用性功能 参考配置文件&#xff1a; /usr/share/doc/keepalived/keepalived.conf.vrrp.localche…

机器学习——分类问题、logistic分类算法

之前我们学习的线性回归算法&#xff0c;适用于预测值y为连续值的情况下&#xff0c;但是在分类问题中&#xff0c;预测值y是个离散值&#xff0c;所以线性回归算法不适用。在这篇文章中&#xff0c;主要以二分类问题为例&#xff0c;介绍分类算法————logistic回归算法&…

Docker容器化解决方案(容器生命周期管理)

容器生命周期管理 1.run 创建一个新的容器并运行一个命令 语法格式docker run [OPTIONS] IMAGE [COMMAND][ARG...] 备注:其实跟docker create一样的语法格式&#xff0c;只不过可以运行容器甚至进入容器内部COMMAND: 需要在容器内执行的命令docker run执行流程首先在指定镜像…

基于单片机的老人防丢系统设计

目 录 摘 要 I Abstract II 引 言 3 1 系统总体架构 6 1.1方案设计与选择 6 1.2 系统架构设计 6 1.3 系统器件选择 7 2 系统硬件设计 9 2.1 单片机外围电路设计 9 2.2 LCD1602液晶显示电路设计 12 2.3 短信模块电路设计 14 2.4 GPS模块电路设计 14 2.5 电源与按键控制电路设计…

创邻科技获评环紫金港创新生态圈智源创新企业

3月1日&#xff0c;由杭州城西科创大走廊管理委员会指导&#xff0c;中共杭州市西湖区委员会、西湖区人民政府主办的“环紫金港创新生态圈”行动推进大会暨2024年紫金港科技城经济高质量发展大会在杭州举办。凭借重要的生态位置和创新业务成果&#xff0c;创邻科技受邀参会并被…

WPF ListBox滚动条一直在最底部

需求&#xff1a;解压文件 显示解压进度 private void AppendProcessText(string content){//注意这两段代码的先后顺序listBox01.Items.Add(content);listBox01.ScrollIntoView(listBox01.Items[listBox01.Items.Count - 1]);}

CubeMX使用教程(2)——点亮LED

在上一章&#xff0c;我们完成了CubeMX的环境配置&#xff0c;这一章我们通过CubeMX来完成点亮LED的工作。 通过LED原理图可知&#xff0c;如果我们要点亮LD1&#xff08;第一个灯&#xff09;&#xff0c;它对应开发板的PC8端口&#xff0c;因此我们应该在CubeMX中将PC8配置为…

Docker-完整项目的部署(保姆级教学)

目录 1 手动部署(白雪版) 1.1 创建网络 1.2 MySQL的部署 1.2.1 准备 1.2.2 部署 1.3 Java项目的部署 1.3.1 准备 1.3.1.1 将Java项目打成jar包 1.3.1.2 编写Dockerfile文件 1.3.2 部署 1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下 1.3.2.2 构建镜像 …

工业耐火砖的尺寸标准检测装置设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 系统方案设计 3 1.2 系统工作原理 5 2 项目硬件设计 6 2.1 主控模块 6 2.2 检测模块 8 2.3 驱动模块 10 2.4 电源模块 11 2.5 按扭模块 13 2.6 指示灯模块 14 2.7 系统传送机构 14 2.8 总体设计 15 3 项目软件设计 17…

可以实现单个、两个、四个圆角的qml自定义控件

控件名: RadiusRectangle File: RadiusRectangle.qml import QtQuick 2.0Item {id: rootwidth: 100height: 100clip: trueproperty int itemRadius: 0property color itemColor: "red"property real itemOpacity: 1property int rightMargin: 0property int leftMar…

Finetuning Large Language Models: Sharon Zhou

Finetuning Large Language Models 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/finetuning-large-language-models/ 本文是学习笔记。 Goal&#xff1a; Learn the fundamentals of finetuning a large language model (LLM). Understand how finetu…

143:vue+leaflet 在25833投影坐标下,加载一小块图像叠层数据

第143个 点击查看专栏目录 本示例是介绍如何在vue+leaflet, 自定义CRS,形成新的投影,这里是25833投影,并使用 L.Proj.imageOverlay的方法在地图上加载载一小块图像叠层数据。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式…

Redis冲冲冲——redis数据类型及对应的数据结构

目录 引出redis数据类型及对应的数据结构Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户…

Pycharm的Project Structure (项目结构)

文章目录 一、Sources二、Tests三、Exeluded四、Namespace packages五、Templates六、Resources 一、Sources 源代码根目录&#xff1a;包含项目的主要源代码&#xff0c;它会在这个目录下搜索代码&#xff0c;然后自动补全和只能提示都通过这里的代码提供。若项目运行自定义代…

基于ACM32 MCU的电动滑板车方案介绍

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

深度解读NCDA设计大赛中园林/景观设计命题

未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;又在火热进行中&#xff0c;各个命题单元也都在陆续的发出自己的参赛要求&#xff0c;不知道各位大学生们准备的怎么样了。相信大家一定在全网搜索往年 NCDA 的获奖作品&#xff0c;今天我就给大家整理了一些 N…

【Pytorch】进阶学习:基于矩阵乘法torch.matmul()实现全连接层

【Pytorch】进阶学习&#xff1a;基于矩阵乘法torch.matmul()实现全连接层 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

在Jetson Xavier NX 开发板上使用VScode执行ROS程序详细过程

1.创建 ROS 工作空间ws 在home下打开终端输入下面指令 mkdir -p xxx_ws/src(必须得有 src) cd 自己命名_ws catkin_make2.启动 vscode cd 自己命名_ws code .3.vscode 中编译 ros 快捷键 ctrl shift B 调用编译&#xff0c;在上方弹窗位置选择:catkin_make:build 可以点击…

Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…