Leetcode 413. Arithmetic Slice 算术序列切片(动态规划,暴力)

题目描述

如果一个数组1.至少三个元素2.两两之间差值相同,那么这个数组就是算术序列

比如下面的数组都是算术序列:

1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

但是这一个就不是:

1, 1, 2, 5, 7

求给定数组,能有多少个算术序列

测试样例

Input: [1, 2, 3, 4]
Output: 3
有三个算术序列切片:
[1,2,3], [2,3,4], [1,2,3,4]
注意,切片是不能跳着选的...

详细分析

  1. 暴力:

    从长度3开始直到数组那么长,每次暴力求[k,k+len]是否是算术序列(是否两两差值相同)即可。

  2. 动态规划:

    对于[1,2,3,4,3,5,6],我们从3开始:

  • [1,2,3]是一个算术序列,dp[2]=1
  • 然后继续[2,3,4],是算术序列则dp[3]=dp[2]+1;
  • 继续[3,4,3]不是算术序列,dp[4]=0
  • 继续[4,3,5] dp[5]=0
  • [3,5,6] dp[6]= 0

算法实现

  • 方法1:暴力
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size()<3){
return 0;
} int totalSolution = 0;
for(int dist=3;dist<=A.size();dist++){
for(int k=0;k+dist<=A.size();k++){
// Arithmetic sequence checking for current [k,k+distance] (sub)sequence
bool isArithmeticSeq = true;
int diff = A[k+1] - A[k];
for(int p=k+2;p<k+dist;p++){
if((A[p]-A[p-1])!=diff){
isArithmeticSeq = false;
break;
}
}
if(isArithmeticSeq) totalSolution++; }
}
return totalSolution;
}
};
  • 方法2:DP
class Solution {
public int numberOfArithmeticSlices(int[] A) {
int[] dp = new int[A.length];
int sum = 0;
for(int i=2;i<A.length;i++){
if( (A[i]-A[i-1]) == (A[i-1]-A[i-2]) ){
dp[i]=dp[i-1]+1;
sum +=dp[i];
}else{
dp[i]=0;
}
}
return sum;
}
}

Leetcode 413. Arithmetic Slice 算术序列切片(动态规划,暴力)的更多相关文章

  1. LeetCode 413 Arithmetic Slices详解

    这个开始自己做的动态规划复杂度达到了O(n), 是用的是2维的矩阵来存前面的数据,复杂度太高了, 虽然好理解,但是没效率,后面看这个博客发现没有动态规划做了这个题 也是比较厉害. 转载地址: http ...

  2. LN : leetcode 413 Arithmetic Slices

    lc 413 Arithmetic Slices 413 Arithmetic Slices A sequence of number is called arithmetic if it consi ...

  3. [LeetCode]413 Arithmetic Slices

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  4. LeetCode - 413. Arithmetic Slices - 含中文题意解释 - O(n) - ( C++ ) - 解题报告

    1.题目大意 A sequence of number is called arithmetic if it consists of at least three elements and if th ...

  5. LeetCoce 413. Arithmetic Slices

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  6. Week 8 - 338.Counting Bits & 413. Arithmetic Slices

    338.Counting Bits - Medium Given a non negative integer number num. For every numbers i in the range ...

  7. 【BZOJ1489】[HNOI2009]双递增序列(动态规划)

    [BZOJ1489][HNOI2009]双递增序列(动态规划) 题面 BZOJ 洛谷 题解 这\(dp\)奇奇怪怪的,设\(f[i][j]\)表示前\(i\)个数中,第一个数列选了\(j\)个数,第二 ...

  8. 【python】序列切片和range函数

    序列的每个元素都可以用2种索引的表达方式,一种是正数索引,另一种是负数索引. 序列切片,作用是访问序列中一定范围的元素,格式“序列名[A:B]”,其中A为所切片的第一个元素的索引号,而B为切片后剩下的 ...

  9. 【BZOJ1046】上升序列(动态规划,贪心)

    [BZOJ1046]上升序列(动态规划,贪心) 题面 BZOJ 洛谷 题解 我一开始看错题了,一度以为是字典序最小的序列. 最后发现它要求的字典序是位置的字典序最小. 那就很好办了. 设\(f[i]\ ...

随机推荐

  1. For input String:"" 异常记录

    开发中遇到  For input String:""  这个异常,一般为在将字符串转换为数字类型时, 出现转换的异常,常见的比如输入的字符串为空串

  2. ZigBee协议栈中AES加密算法

    原文地址:ZigBee协议栈中AES加密算法作者:大浪淘沙 Z-stack对Zigbee2006提供了全面的支持,功能之强大,性能稳定.安全性高,说到安全性是我们今天的主题.CC2430硬件支持128 ...

  3. CentOS7 启动docker.service失败(code=exited, status=1/FAILURE)

    启动报错 Job for docker.service failed because the control process exited with error code. See "sys ...

  4. fhq-treap模板

    模板保存. #include<iostream> #include<cstdio> #include<cstring> #include<ctime> ...

  5. SpringAOP02 自定义注解

    1 自定义注解 1.1 创建自定义注解 从java5开始就可以利用 @interface 来定义自定义注解 技巧01:注解不能直接干扰程序代码的运行(即:注解的增加和删除操作后,代码都可以正常运行) ...

  6. Docker学习笔记_Dockerfile常用指令

    Dockerfile常用指令

  7. 在Win7 64位电脑上安装Sql Server 2008 R2 Express

    安装环境说明: 操作系统:Win7 64位 英文版 安装步骤: 1.准备安装文件 下载网址:https://www.microsoft.com/zh-CN/download/details.aspx? ...

  8. 通过kfed自动获取磁盘信息的小脚本

    通过kfed自动获取磁盘信息的小脚本 编译KFED [oracle@rac lib]$cd $ORACLE_HOME/rdbms/lib [oracle@rac lib]$ pwd /u01/app/ ...

  9. c# 导入c++ dll

    1.类的函数的内联实现 #include "stdafx.h" #include "testdll.h" #include <iostream> # ...

  10. oracle数据库数据类型和约束

    今天为大家分享一下关键数据库里面的数据类型和约束.我们都知道国家要讲法律,干什么事情都要遵守法律,比如小的时候你上学的时候要遵守课堂纪律.不能迟到和早退,同样的我们在数据库中创建一些表.或者查询一些表 ...