JavaScript|LeetCode|动态规划|413.等差数列划分

求最长等差数列(动态规划) 给你n个数,求出其最长的等差数列的子序列。 首先问题并没有要求要按照原来数组的顺序,所以可以先对该数组排序 1. 如果不要求该最长子序列中的元素是相邻的话,可以用一个简单的DP来完成。算法的复杂度是O( n^ 2)。 模板 const int MAX=1010; int dp[MAX][MAX];//dp[i][j]以i为结尾的某子序列(该子序列的公差为j)的最大长度 阅读详情

法1:动态规划
看了题解
想法:
例如数组:A = [1,2,3,4]

  1. 等差数列至少有3个元素,故考虑以A[2]、A[3]结尾的等差数列。
  • 以A[2]结尾的等差数列:[1,2,3] (A[2] - A[1] == A[1] - A[0])
  • 以A[3]结尾的等差数列:
    • [2,3,4] (A[3] - A[2] == A[2] - A[1])
    • 因为A[3]与A[2]、A[1]成等差数列,又A[2]与A[1]、A[0]成等差数列,故A[3]与A[2]、A[1]、A[0]成等差数列。可以发现:若A[3]与A[2]、A[1]成等差数列,则以A[2]结尾的等差数列加上A[3]还是等差数列;故以A[3]结尾的等差数列数 = 以A[2]结尾的等差数列数 + 1 (此处加上的 1 为:A[3]与A[2]、A[1],因为:1. 以A[2]结尾的等差数列不包括[A[1], A[2]];2. 只有A[3]与A[2]、A[1]成等差数列,以A[3]结尾的等差数列数才等于(以A[2]结尾的等差数列数 + 1),否则为0
  1. 用dp[i]保存以A[i]结尾的等差数列个数,最后的结果为dp所有元素之和
/** 
* @param {number[]} A 
* @return {number} 
*/
var numberOfArithmeticSlices = function(A) {    
    var i = 0, dp = [], sum = 0;    
    dp[0] = dp[1] = 0;    
    for(i = 2; i < A.length; i++) { // 等差数列至少是3个数        
        if(A[i] - A[i - 1] == A[i - 1] - A[i - 2]) {            
            dp[i] = dp[i - 1] + 1;        
        }        
        else {            
            dp[i] = 0;        
        }    
    }    
    for(i = 0; i < dp.length; i++) {        
        sum += dp[i];    
    }    
    return sum;
};

优化
想法:

  1. 发现dp[i]的值只与dp[i - 1]有关,只需两个变量保存中间值,sum在dp[i]生成时就加上
/** 
* @param {number[]} A 
* @return {number} 
*/
var numberOfArithmeticSlices = function(A) {    
    var i = 0, pre = 0, cur = 0, sum = 0;
    // cur保存以当前元素结尾的等差数列数
    // pre保存以当前元素的前一个元素结尾的等差数列数	    
    for(i = 2; i < A.length; i++) { // 等差数列至少是3个数        
        if(A[i] - A[i - 1] == A[i - 1] - A[i - 2]) {            
            cur = pre + 1;        
        }        
        else {            
            cur = 0;        
        }        
        sum += cur;        
        pre = cur;    
    }    
    return sum;
};
JavaScript|LeetCode|动态规划|714. 买卖股票的最佳时机含手续费 法1:动态规划 想法: 数组dp保存每一天的利润最大值 在第 i 天,对于第 j (j < i)天的股票:dp[i]=Math.max(dp[i],dp[j]+prices[i]−prices[j]−fee,dp[j])dp[i] = Math.max(dp[i], dp[j] + prices[i] - prices[j] - fee, dp[j])dp[i]=Math.max(dp[i... 阅读详情

相关推荐

拆开华为BBU5900,看看5G基站的大脑里到底装了啥?

本文深度拆解华为BBU5900,揭示5G基站核心处理单元的硬件架构与设计哲学。通过详细解析模块化设计、智能电源系统和动态散热方案,展现其支撑千兆速率、毫秒级时延的技术奥秘,为5G网络部署提供实用参考。

weixin_31456563的博客 562

Leetcode——413. 等差数列划分

题目描绘:题目链接 题目中需要求解一个数组中等差数组的个数,这个问题可以利用动态规划的思路来分析。 三步骤: 1:问题归纳。题目需要求解等差数列的和,我们可以用一个数组保存前i个元素可以构成的等差数列的个数。dp[ i ],最后需要的时候再求和。 2:递归关系式的书写:等差数列无非要满足这个关系:a[ i ] - a[i-1] = a[i-1] - a[i-2];如果再添加一个元...

weixin_38168139的博客 145

ComfyUI全自动换装工作流:从零到一的实战指南

本文提供了一份详细的ComfyUI全自动换装工作流实战指南。从环境配置、模型准备到核心工作流架构的逐步拆解,手把手教你搭建一条高效的AI换装流水线。文章深入解析了从输入、预处理、融合到输出的四步核心逻辑,并分享了关键参数调优与进阶技巧,旨在帮助电商从业者、内容创作者及AI爱好者轻松实现高质量、高效率的“一键换装”。

weixin_29198045的博客 896

动态规划-数组中求最长等差数列的长度

题目:给定一个数组求出数组最长等差数列的长度。 举例:3,8,4,5,6,2 输出:5。 思路:利用区间dp来做,dp[i][diff]的意思是 intAr[0]到intAr[i],等差为diff的等差长度。在求dp长度的时候利用一个ans变量保存最大即可。 dp的求法: 有diff=intAr[i]-intAr[j](j<i) dp[i][diff]=dp[j][diff]。 细节处

lizhao007 4715

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 715

Qt中多线程的使用(一)

我们要实现的是读取大文件qtgui.index的内容加入文本框中。 很容易想到的方法: QFile* file = new QFile("E:\qtgui.index"); file-&gt;open(QIODevice::ReadOnly); QTextStream *stream = new QTextStream(file); while(!st...

yao5hed的专栏 1万+

413. 等差数列划分

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 413. 等差数列划分题目描述解题过程解题思路总结 题目描述 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是等差数列。 1, 1, 2, 5, 7 数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q

qq_34241578的博客 140

华为EC6108V9E刷机实战:从U盘准备到开机优化的完整避坑指南

本文提供华为悦盒EC6108V9E刷机与优化的完整实战指南。针对搭载RK3228芯片和安卓4.4.4系统的设备,从型号确认、固件选择、U盘准备,到详细刷机步骤、常见故障排除,以及刷机后的深度性能优化,手把手帮助用户规避风险,让旧盒子焕发新生,成为流畅的全能媒体中心。

weixin_29324401的博客 1191

leetcode413. 等差数列划分

题目地址 https://leetcode-cn.com/problems/arithmetic-slices/ 题目描述 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。 子数组 是数组中的一个连续序列。 示例 1: 输入:nums = [1,2,3,4] 输出:3 解释:nums

lucky__peng的博客 168

选课系统进不去?我用 Python 做了个“捡漏挂机”脚本,全自动监控空余名额

频率控制:脚本请求频率不要太高(建议间隔 3-5 秒以上),否则可能被教务系统封 IP,甚至会被教务处请喝茶。仅供学习:本文旨在通过选课场景教学requests和网络抓包原理,请勿用于非法用途或破坏公平性。刷新页面 -> 等待加载 -> 用眼睛看人数 -> 没满?-> 点击选课 -> 确认这个流程最大的瓶颈在于**“等待加载”和“人的反应时间”**。网页加载需要渲染 HTML、CSS、图片,而 Python 脚本只需要请求一个微小的 JSON 数据接口,速度是浏览器的10 倍以上。fill:#333;

BUG猿的博客 292

MTK平台Wi-Fi学习--wifi channel 通过国家码进行功率限制和wifi eFEM 基本配置和wifi Tx SEM问题

本文介绍了WiFi功率限制配置和eFEM硬件设置方法。在功率限制方面,通过国家码可针对不同信道设置功率上限,需在rlm_txpwr_init.h文件中配置信道和功率值(单位0.5dBm),WiFi6的HE_TB模式还可分RU设置。eFEM硬件配置需参考平台设计,注意VDET接口处理,首次使用建议提交HW/SW案例审核。软件配置需获取专用FEM包,包含NVRAM、GPIO等文件,按指导合并后版本才会切换为eFEM版本。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 484

LeetCode刷题之动态规划,从易到难思路总结(JS实现)

只有两种情况就是从上面一个格子来或者从左边一个格子来,那么状态转移方程很明显就是:dp[i][j] = dp[i-1][j] + dp[i][j-1]否则,以nums[i]结尾的等差数列必定能以nums[i-1]结尾,且多了一个 nums[i-2],nums[i-1],nums[i] 的等差数列。DP[k][i] = DP[k-1][i] + DP[k][i-k] // 选择到第k-1个硬币时的方案 + 有了第k个硬币的方案。状态转移方程:dp[i] = dp[i] + dp[i - coins[j]]

m0_56500768的博客 431

万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

杨秀璋的专栏 2万+

413. Arithmetic Slices [JavaScript]

一、解题思路   这是一道典型的动态规划题目,首先定义状态: dp[i]表示以A[i]结尾的等差数列的个数。   至少三个数才有可能形成一个等差数列,那么边界状态为: dp[0] = 0 dp[1] = 0   状态转移方程: 如果 A[i] - A[i - 1] === A[i - 1] - A[i - 2] ===&amp;gt; dp[i] = dp[i - 1] + 1 ...

descire 102

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

好青年 | leetcode 今日事今日毕(GitHub Actions集成LeetCode每日一题至issues)

nice-js-leetcode????????????Please sharehttps://github.com/nice-people-frontend-community/nice-js-leetcode好青年 | leetcode 今日事今日毕,Leetcode 乐园开业啦,想拥有下面各种萌物吗?快来领取哦。????????写题模版????:例如:leetcode 198.打家劫舍????目...

程序员哆啦A梦,蓝胖子 565

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JavaScript|LeetCode|动态规划|343.整数拆分

法1:动态规划 看了题解 想法: “给定一个正整数 n,将其拆分为至少两个正整数的和”。则 n >= 2 用数组dp保存整数 1 ~ n 经拆分后的最大乘积(后续需用到dp[1] = 1,比如 3 = 1 + 2) 拆分整数 i 时,先将其拆分为 i - j 和 j;最大值在下面几种情况中产生: (i - j) * j:即 i - j 和 j 均不再拆分 dp[i - j] * dp[...

J_learner的博客 634

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaScript|LeetCode|动态规划|322. 零钱兑换

法1:动态规划 看了题解 想法: 总金额amount是背包容量 coins是物品(coins.length是物品种类;coins[i]为每种物品的体积) 每种物品有无限个 目标:用最少数量的物品把背包填满 /** * @param {number[]} coins * @param {number} amount * @return {number} */ var coinChange...

J_learner的博客 503

JavaScript|LeetCode|动态规划|72. 编辑距离

法1:动态规划 想法: 先看看题目给的例子:word1 = “horse”, word2 = “ros” 初始化:每增加一行,表示指向 word1 的指针(i)向后移动一个字符;每增加一列,表示指向 word2 的指针(j)向后移动一个字符;当一个字符串为空时,另一个串只需要不断删除字符即可;假设填写数字的部分为 dp 数组,里面的数字为使得 word1 和 word2 当前字符串(即从第 0 位到各自指针指向的位置)相等的最小操作数 进行表格的填写,发现规律 对于dp[1][1],因为word1[

J_learner的博客 441

JavaScript|LeetCode|动态规划|1143. 最长公共子序列

法1:动态规划 看了题解 推荐去看 力扣 的该题题解 想法: 创建数组dp:dp[i][j]保存text1前i个、text2前j个字符中的两者的最长公共子序列;dp[0][j]和dp[i][0]均为0,因为此时表示text1或text2取空字符串时 /** * @param {string} text1 * @param {string} text2 * @return {number} ...

J_learner的博客 397

JavaScript|LeetCode|动态规划/BFS|279.完全平方数

法1:动态规划 想法: 数组dp保存当n = 1, 2, 3, ……时,将n分割成多个完全平方数的 完全平方数个数(最少个数) 如果 i 是完全平方数,则dp[i] = 1 如果 i 不是完全平方数,则dp[i] = min{dp[i], dp[i - j] + dp[j]}:将 i 分为两部分(j = 1 ~ i - 1),各部分可能也会被分割,但:动态规划无需考虑如何来,只需考虑结果如何(只...

J_learner的博客 379

JavaScript|LeetCode|动态规划|583. 两个字符串的删除操作

法1:动态规划 想法: 参见 JavaScript|LeetCode|动态规划|1143. 最长公共子序列 假设 word1 和 word2 的最长公共子序列长度为 L 最小步数 = word1.length - L + word2.length - L /** * @param {string} word1 * @param {string} word2 * @return {number} */ var minDistance = function(word1, word2) {

J_learner的博客 373

JavaScript|LeetCode|动态规划|62.不同路径

法1:动态规划 方法类同JavaScript|LeetCode|动态规划|64.最小路径和 法2 想法: 使用一个一维数组dp,来保存到达当前行的每个网格的不同路径数 到达第一行或第一列的每个网格的不同路径数目均为1 到达其他网格的不同路径数目:当前网格上面的一个网格、当前网格左面的一个网格,到达这两者的不同路径数之和 /** * @param {number} m * @param {n...

J_learner的博客 365

JavaScript|LeetCode|搜索|93.复原IP地址

法1:回溯 看了答案 想法: IP地址由4部分组成,四部分之间由 . 分隔,如:255.255.255.255(即11111111.11111111.11111111.11111111) 每部分>=0 && 每部分<= 255 每部分没有前导零 当前IP地址已经有4部分 && 输入的字符串已访问完最后一位,则当前IP地址是答案之一,存入 增加一个部分-...

J_learner的博客 361

JavaScript|LeetCode|双指针|167. 两数之和 II - 输入有序数组

法1 暴力破解 var twoSum = function(numbers, target) { var i,j; for(i = 0; i < numbers.length; i++) { for(j = 1; j < numbers.length; j++) { if(i == j) { con...

J_learner的博客 353

JavaScript|LeetCode|动态规划|416. 分割等和子集

法1:动态规划 想法: 将两个子集看作背包(容量均为数组元素和 / 2),数组中的数字作为物品(每个数字的值作为每个物品的体积) 问题:如何使得两个背包背的物品体积相等呢? 回答:只需要使得一个背包可以正好装满即可! 数组dp表示:容量为0~(数组元素和 / 2)的背包,可以容纳的物品的最大体积和 /** * @param {number[]} nums * @return {boolea...

J_learner的博客 339

JavaScript|LeetCode|动态规划|300.最长上升子序列

法1:动态规划 想法: 用数组dp保存:以nums[i]结尾的最长上升子序列长度 对于nums中每个数,dp[i]初始化为1,至少包含nums[i]本身 对于nums[i],要求dp[i],关键在于:找到dp[j],nums[j] < nums[i] (j < i),则dp[i] = dp[j] + dp[i]。注:需找到符合条件的dp[j]的最大值 最长上升子序列可能以 nums[...

J_learner的博客 335
上一篇: JavaScript|LeetCode|动态规划|303.区域和检索-数组不可变
下一篇: JavaScript|LeetCode|动态规划|343.整数拆分
J_learner
博客等级 码龄8年 2粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值