446. 等差数列划分 II - 子序列

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。

例如,以下数列为等差数列:

1, 3, 5, 7, 9

7, 7, 7, 7

3, -1, -5, -9

以下数列不是等差数列。

1, 1, 2, 5, 7

数组 A 包含 N 个数,且索引从 0 开始。该数组子序列将划分为整数序列 (P0, P1, …, Pk),P 与 Q 是整数且满足 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]

PS:

等差数列,差相等,我for循环,把差当作map的key,数量当作value,然后暴力大法

class Solution {
public int numberOfArithmeticSlices(int[] A) {
int n = A.length;
long ans = 0;
Map<Integer, Integer>[] cnt = new Map[n];
for (int i = 0; i < n; i++) {
cnt[i] = new HashMap<>(i);
for (int j = 0; j < i; j++) {
long delta = (long)A[i] - (long)A[j];
if (delta < Integer.MIN_VALUE || delta > Integer.MAX_VALUE) {
continue;
}
int diff = (int)delta;
int sum = cnt[j].getOrDefault(diff, 0);
int origin = cnt[i].getOrDefault(diff, 0);
cnt[i].put(diff, origin + sum + 1);
ans += sum;
}
}
return (int)ans;
} }

最新文章

  1. npm插件制作及发布基础教程
  2. JavaScript-在当前显示区范围内实现点不到的小方块
  3. PHP中PSR-[0-4]代码规范
  4. java笔记--超级类Object多线程的应用+哲学家进餐算法内部类与多线程结合
  5. 安装Laravel之坎坷记述
  6. 多个html编辑器在同一页面加载
  7. Baidu Sitemap Generator插件使用图解教程
  8. 了解神奇的this
  9. hdu2050(递推)
  10. Js原生轮播-直接上代码
  11. ABP框架源码学习之修改默认数据库表前缀或表名称
  12. MQ知识点汇总
  13. abap 基本知识
  14. 《Effective Java》读书笔记六(方法)
  15. asp.net 添加错误日志
  16. Java Hibernate Validator
  17. Tortoise SVN 使用
  18. 最详尽的IntelliJ IDEA项目web项目搭建!!!!!!
  19. android中的键值对
  20. vue遇到的坑(一)——数组更新

热门文章

  1. 为什么PUSH推送要经常背锅?
  2. zabbix-agent客户端安装与配置
  3. Echarts关于tree树数据渲染图例最新实例
  4. interface和abstract 的区别和相同点
  5. MySQL表的CRUD及多表查询
  6. DPDK IP分片及重组库(学习笔记)
  7. codis原理及部署_01
  8. linux_centos7_时间更新
  9. 牛客网挑战赛19 B,C,F
  10. D:Sequence Swapping