map+DP leetcode446

 

如果数字序列由至少三个元素组成并且任何两个连续元素之间的差异相同,则称为算术序列。

例如,这些是算术序列:

1,3,5,7,9 
7,7,7,7 
3,-1,-5,-9 
以下序列是不算术。

1, 1, 2, 5, 7

给出了由N个数组成的零索引数组A. 该阵列的子序列切片是任何整数序列(P0,P1,...,Pk),使得0≤P0<P1 <... <Pk <N。

如果序列A [P0],A [P1],...,A [Pk-1],A [Pk]是算术的,则阵列A的子序列片(P0,P1,...,Pk)被称为算术。特别是,这意味着k≥2。

该函数应返回数组A中的算术子序列片数。

输入包含N个整数。每个整数的范围为-231和231-1,0≤N≤1000。输出保证小于231-1。

例:

输入:[2,4,6,8,10]

输出:7

说明:
所有算术子序列切片为:
[2,4,6] 
[4,6,8] 
[6,8,10] 
[2,4,6,8] 
[4,6,8,10] 
[2,4,6,8,10] 
[2,6,10]

 

 

简单的子序列这种题,一般思路先想到的dp就是设置以第i个元素结尾的一种状态,然后能推到最后吧?

比如最长递增子序列这种的题。

 

那我们就试试:dp[i]代表以第i个元素结尾的等差数列的个数。

然后我们想一下状态转移方程是什么?

我们会发现,挺难推出来的。。因为对于本个元素,最容易想的思路就是把前面的结尾都遍历一遍,然后能组成等差数列的都加起来吧?

但是我们无法判断之前的结尾组成的等差数列中,加上第i个元素还能不能是等差数列。。。

比如第5个数是5,能和前面组成1,2,3,4,5和2,3,4,5和3,4,5和1,3,5这几个序列,那dp[4]应该是4咯,我们对于后面的结尾,比如数字7,算dp时,遍历到dp[4]了,我们无法判断dp[4]里这四个序列有几个公差为7-5=2(也就是能组成)。

我之前写过,动态规划就是空间优化时间的算法。

我们推不出来,因为信息不全。需要记录更多的信息。我们不止要知道dp[i]是多少,还要知道每个公差的序列有多少,才能推出来之后的dp序列。

我们可以二维dp[a][b]表示第a个元素结尾公差为b的序列个数,但是由于数据较为稀疏,浪费空间时间较大,我们可以map走一波。

比如上面那个例子,我们要记录:dp[4],公差为1的序列有仨,公差为2的有一个。

这样,我们之后遇到了6,那6-5=1,dp[4]里有三个序列公差为1,我们就能知道这三个序列加上6还是等差的。

遇到7,也能7-5=2,找dp[4]中公差为2的即可。

 

还有一个需要注意的点:题目说长度最小为3才算。

过程叙述:

计算两个数字之差diff,如果越界了不做处理

如果没越界,dp[i]中diff的映射增1,然后看dp[j]中是否有diff的映射

如果有的话,说明此时已经能构成等差数列了(三个数),将dp[j][d]加入结果res中,然后再更新dp[i][d]

这样等遍历完数组,res即为总数。

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <cmath>using namespace std;class Solution 
{
public:int numberOfArithmeticSlices(vector<int>& A) {if (A.size() <= 2)return 0;int count = 0;vector<map<int, int>> dp(A.size());for (int i = 0; i < A.size(); i++){for (int j = 0; j < i; j++){if ((long)A[i] - (long)A[j] > INT_MAX || (long)A[i] - (long)A[j] < INT_MIN) continue;//节省时间int diff = A[i] - A[j];//公差dp[i][diff] += 1;if (dp[j].find(diff) != dp[j].end()) //能构成至少三个数等差{dp[i][diff] += dp[j][diff];count += dp[j][diff];}}}return count;}
};


 

 

 

 

 

 

 

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

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

相关文章

如何使用cookie信息,完成自动登录

在做爬虫任务的时候&#xff0c;我们常常会遇到很多网页必须登录后&#xff0c;才可以开放某些页面。所以登录是爬取网页的第一步。但是&#xff0c;通过post表单&#xff08;包含用户名和密码&#xff09;的方法&#xff0c;对于那些不需要输入比较复杂的验证码的网页&#xf…

Spring Cloud 学习笔记(1 / 3)

Spring Cloud 学习笔记&#xff08;2 / 3&#xff09; Spring Cloud 学习笔记&#xff08;3 / 3&#xff09; ---01_前言闲聊和课程说明02_零基础微服务架构理论入门03_第二季Boot和Cloud版本选型04_Cloud组件停更说明05_父工程Project空间新建06_父工程pom文件07_复习Depend…

后缀树/后缀数组

字典树&#xff1a;https://blog.csdn.net/hebtu666/article/details/83141560 后缀树&#xff1a;后缀树&#xff0c;就是把一串字符的所有后缀保存并且压缩的字典树。 相对于字典树来说&#xff0c;后缀树并不是针对大量字符串的&#xff0c;而是针对一个或几个字符串来解决…

kaggle(02)-房价预测案例(基础版)

房价预测案例 Step 1: 检视源数据集 import numpy as np import pandas as pd读入数据 一般来说源数据的index那一栏没什么用&#xff0c;我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。 有人的地方就有鄙视链。跟知乎一样。Kaggle的也是个处…

为什么Python中整型不会溢出

前言 本次分析基于 CPython 解释器&#xff0c;python3.x版本 在python2时代&#xff0c;整型有 int 类型和 long 长整型&#xff0c;长整型不存在溢出问题&#xff0c;即可以存放任意大小的整数。在python3后&#xff0c;统一使用了长整型。这也是吸引科研人员的一部分了&am…

如何使用github中的pull request功能?

* pull request是社会化编程的象征&#xff0c;通过这个功能&#xff0c;你可以参与到别人开发的项目中&#xff0c;并做出自己的贡献。pull request是自己修改源代码后&#xff0c;请求对方仓库采纳的一种行为*–《github入门与实践》 下面具体说一下github中使用pull reque…

「假装努力」

有多少人在「假装努力」&#xff1f; 又有多少人在「真正成长」&#xff1f; 再努力努力 回想起当年毕业后&#xff0c;在北京和室友合租的日子。 那时&#xff0c;我在工作&#xff0c;室友在培训。 一天&#xff0c;我下班回来&#xff0c;听见他在电话里和家人争吵&…

如何阅读论文?

本文主要讲述了如何才能高效的阅读一篇论文&#xff01;&#xff01;

贪吃蛇js

python都学不懂&#xff0c;c又不会&#xff0c;只能写写js来维持生活了。555555 js&#xff1a; window.onload function() {var wrap document.getElementsByClassName("wrap")[0];var uls document.getElementsByClassName("sbody")[0];var hand …

Android studio安装过程中入的坑的记录与记录

Android studio安装过程中入的坑的记录与记录 * 由于最近项目的需求&#xff0c;所以最近一直在配置安卓的开发环境&#xff0c;之前用的是Eclipse ADT的模式开发的&#xff0c;配置环境也花了一些时间&#xff0c;但是由于谷歌大力扶持它的亲儿子Android Studio&#xff0c;…

动态规划基础水题提纲

提纲 汉诺塔 汉诺塔&#xff1a;汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新…

数据结构课上笔记8

串的概念&#xff1a;串&#xff08;字符串&#xff09;&#xff1a;是由 0 个或多个字符组成的有限序列。 通常记为&#xff1a;s ‘ a1 a2 a3 … ai …an ’ ( n≥0 )。 串的逻辑结构和线性表极为相似。 一些串的类型&#xff1a; 空串&#xff1a;不含任何字符的串&#x…

数据结构课上笔记9

数组&#xff1a;按一定格式排列起来的具有相同类型的数据元素的集合。 二维数组&#xff1a;若一维数组中的数据元素又是一维数组结构&#xff0c;则称为二维数组。 同理&#xff0c;推广到多维数组。若 n -1 维数组中的元素又是一个一维数组结构&#xff0c;则称作 n 维数组…

pySerial -- Python的串口通讯模块

pySerial Overview This module encapsulates the access for the serial port. It provides backends for Python running on Windows, Linux, BSD (possibly any POSIX compliant system), Jython and IronPython (.NET and Mono). The module named “serial” automatica…

串的堆分配实现

今天&#xff0c;线性结构基本就这样了&#xff0c;以后&#xff08;至少是最近&#xff09;就很少写线性基础结构的实现了。 串的类型定义 typedef struct {char *str;int length; }HeapString; 初始化串 InitString(HeapString *S) {S->length0;S->str\0; } 长度 …

Numpy 入门

Numpy 入门 Numpy简介 官网链接&#xff1a;http://www.numpy.org/NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库 Numpy的基本功能 快速高效的多维数组对象ndarray用于对数组执行元素级计算以…

数据结构课上笔记10

树 树的定义&#xff1a;树(Tree)是 n(n≥0)个结点的有限集。若 n0&#xff0c;称为空树&#xff1b;若 n > 0&#xff0c;则它满足如下两个条件&#xff1a; (1) 有且仅有一个特定的称为根 (Root) 的结点&#xff1b; (2) 其余结点可分为 m (m≥0) 个互不相交的有限…

pandasStudyNoteBook

pandas 入门培训 pandas简介 - 官网链接&#xff1a;http://pandas.pydata.org/ - pandas pannel data data analysis - Pandas是python的一个数据分析包 , Pandas最初被作为金融数据分析工具而开发出来&#xff0c;因此&#xff0c;pandas为时间序列分析提供了很好的支持 …

最大搜索子树

给定一个二叉树的头结点&#xff0c;返回最大搜索子树的大小。 我们先定义结点&#xff1a; public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value data;}} 分析&#xff1a; 直接判断每个节点左边小右边大是…

二叉树最长路径

分析&#xff1a; 暴力求每一段距离也可。 对于以本节点为根的二叉树&#xff0c;最远距离有三种可能&#xff1a; 1&#xff09;最远路径来自左子树 2 &#xff09;最远路径来自右子树&#xff08;图示与左子树同理&#xff09; 3&#xff09;最远路径为左右子树距离根最远…