递推算法之滚动数组思维方式

概述

在算法的最终结果只用到本层与上一层的结果时, 可以使用滚动数组思想。

简单的理解就是每次都使用固定的几个存储空间达到压缩节省存储空间的作用, 主要用在递推算法中。

示例1: 爬楼梯问题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

由题可知, 在爬上第 n 阶楼梯时,可以爬 1 个或 2 个台阶, 即爬上最后一阶台阶时,总办法数 = 最后一阶台阶是 n-1 阶与 最后一阶台阶是 n-2 阶的办法数的和, 即状态转移方程为:
f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n1)+f(n2)
接下来推算边界条件,即:
f(1)=1,f(2)=2f(1)=1, f(2)=2f(1)=1,f(2)=2
即最后的代码为:

public int climbStairs(int n) {if (n==1) {return 1;}if (n==2) {return 2;}return climbStairs(n-1)+climbStairs(n-2);
}

这种做法的好处就是比较直观,但是方法的时间复杂度为 O(2n)O(2^{n})O(2n)
所以这里可以用到滚动数组的思想来进行优化:

public int climbStairs(int n) {int left = 0, right = 0, sum = 0;for (int i = 1;i<=n;i++) {left = right;right = sum;sum = left + right;}return sum;
}

这样做的时间复杂度就降到了O(n)O(n)O(n)

示例2: 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

由题可知, 第 n 个元素的结果与第 n-1 个元素的结果以及第 n 个元素的大小有关系, 即:
f(n)=Max(f(n−1)+nums[n],nums[n])f(n) = Max(f(n-1)+nums[n], nums[n])f(n)=Max(f(n1)+nums[n],nums[n])
所以, 问题的解法即遍历数组中所有元素的并求出这些元素对应结果的最大值即可:

public int maxSubArray(int[] nums) {int prev = 0;int max = nums[0];for (int i:nums) {prev = Math.max(prev+i, i);max = Math.max(prev, max);}return max;
}

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

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

相关文章

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…

判断链表是否相交并找出交点

问题概述 单链表定义如下&#xff1a; public class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}}编写程序&#xff0c; 找出两个链表的交点。 如图所示&#xff0c;链表 A 和链表 B 在节点 8 处相交。 算法思路 首先确定一个事情&#xff1a; …

socket和http区别有哪些

socket和http区别有哪些 1、socket连接就是所谓的长连接&#xff0c;理论上客户端和服务器端一旦建立起连接将不会主动断掉&#xff1b; 2、http连接就是所谓的短连接&#xff0c;即客户端向服务器端发送一次请求&#xff0c;服务器端响应后连接即会断掉。 socket和http区别&…

Spring Bean 的生命周期

概述 Spring 启动&#xff0c;扫描指定的包路径&#xff0c;查找需要被 Spring 管理的 bean构造 BeanDefinition 对象实例化 bean&#xff0c;如果有多个构造方法&#xff0c;则需要推断构造方法&#xff0c;确定好构造方法后&#xff0c;进行实例化得到一个对象进行 bean 的属…

兄弟3150cdn更换硒鼓_耗材知多点:一体式硒鼓及分离式硒鼓

相信第一次接触硒鼓的小伙伴们&#xff0c;会比较诧异为什么有些硒鼓可以直接装机使用&#xff0c;而有些硒鼓&#xff0c;却需要两个部件组合起来或分别装机才能正常使用。今天就带大家来了解一下什么是一体式硒鼓&#xff0c;什么又是分离式硒鼓。①一体式硒鼓&#xff1a;以…

Java IO流之PrintStream分析

简介 PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是: 与其他流不同的是,Prin…

bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评

《复仇者联盟4&#xff1a;终局之战》已经上映快三个星期了&#xff0c;全球票房破24亿美元&#xff0c;国内票房破40亿人民币。虽然现在热度逐渐下降&#xff0c;但是我们还是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。后来持续走低&#xff0c;现在《复…

RabbitMQ 基本概念与高级特性

文章目录1. 什么是消息队列1.1 消息队列概述1.2 使用消息队列的优势1.3 使用消息队列的劣势1.4 常见的消息队列产品对比2. RabbitMQ 基本概念2.1 RabbitMQ 概述2.2 RabbitMQ 的概念模型2.2.1 Message2.2.2 Publisher2.2.3 Exchange2.2.4 Binding2.2.5 Queue2.2.6 Connection2.2…

HTTP 和 SOCKET 的区别

HTTP 和 SOCKET 的区别 要弄明白 http 和 socket 首先要熟悉网络七层&#xff1a;物 数 网 传 会 表 应&#xff0c;如图1 如图1 HTTP 协议:超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据. TCP/UDP 协议:传输控制协议&#xff0c;对应于传输层&…

java 8进制串转中文_为什么不能用中文进行编程?而英文就可以

前些天大雄无意间听见几个线下班小伙伴说真的是无(te)意(di)的“我要补英文”“对&#xff0c;英文真的很重要”“如果编码用中文就好了”...听见这大雄就不淡定了中文代码小伙伴确定能够搞懂&#xff1f;&#xff1f;首先我们大概的看一下中文编码&#xff1a;你以为会写中文写…

Java 父子类方法调用顺序

概述 在 Java 的多态中&#xff0c;有个结论可以直接引用: 对象类型看左边静态方法和成员变量看左边成员方法&#xff0c;编译看左边&#xff0c;运行看右边&#xff08;子类可能重写&#xff09;如果有多个匹配的方法可以调用&#xff0c;优先调用参数最匹配的一个 调用顺序…

TCP/IP,HTTP,Socket的区别与联系

TCP/IP,HTTP,Socket的区别与联系 网络七层:物数网传会表应.分别为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层.其中,底层三层:物理层,数据链路层,网络层是网络工程师研究的对象,而其它四层,是用户面向和关心的问题. http协议:超文本传输协议, 对应于应用层. tcp协议…

MATLAB学习笔记(一)求解三阶微分方程

一、求解三阶微分方程 对于多变量三阶微分方程求解问题&#xff0c;这里介绍一种求解方法。 例题如下&#xff1a; 对于以上方程&#xff0c;给定边界条件&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;。求解和的表达式。 二、解题步骤 &#xff08;1&…

Docker exec 命令执行出错, 显示 the input device is not aTTY 的解决办法

问题描述 在使用 docker exec 命令进入容器时&#xff0c;发现报错信息如下&#xff1a; the input device is not a TTY. If you are using mintty, try prefixing the command with winpty解决办法 这是因为命令行权限不足导致的&#xff0c;解决办法就是提升权限 Windo…

JAVA 判断Socket 远程端是否断开连接

JAVA 判断Socket 远程端是否断开连接 最近在做项目的时候&#xff0c;遇到这样一个问题&#xff0c;如何判断 Socket 远程端连接是否关闭&#xff0c;如果关闭的话&#xff0c;就要重建连接Socket的类提供了一些已经封装好的方法&#xff0c; 如 isClosed()、isConnected()、i…

axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型

本文跟大家分享&#xff0c;如何使用axure制作转盘抽奖交互原型&#xff0c;不带登录流程。效果如下&#xff1a;抽奖流程一、主要内容(1)主要元件&#xff1a;动态面板(2)重点&#xff1a;旋转交互、随机函数、触发动作。(3)难点&#xff1a;通过停止位置判断抽奖结果(4)涉及函…

java.lang.relect.Array 类

概述 这是一个位于 java.lang.reflect 包下的类&#xff0c;类中的方法都是静态方法&#xff0c;主要的功能就是更方便地创建数组。在数组元素类型未知时&#xff0c;简化了操作数组的代码。 使用示例 //创建一个长度为 5 的整形数组 //等价于 int[] array new int[4]; int…

日志打印的8种级别(很详细)

日志打印的8种级别&#xff08;很详细&#xff09; 日志的输出都是分级别的&#xff0c;不同的设置不同的场合打印不同的日志。下面拿最普遍用的Log4j日志框架来做个日志级别的说明&#xff0c;其他大同小异。 Log4j的级别类org.apache.log4j.Level里面定义了日志级别&#x…

python格式字符_python格式字符

用python实现接口测试(八、实现序列化与反序列化)前言在python中&#xff0c;序列化可以理解为&#xff1a;把python的对象编码转换为json格式的字符串&#xff0c;反序列化可以理解为&#xff1a;把json格式字符串解码为python数据对象。一、字典&#xff0c;通过json把它序列…