友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
413. 等差数列划分
如果一个数列 至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。
-
例如,
[1,3,5,7,9]
、[7,7,7,7]
和[3,-1,-5,-9]
都是等差数列。
给你一个整数数组 nums
,返回数组 nums
中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
示例 1:
输入:nums = [1,2,3,4] 输出:3 解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
示例 2:
输入:nums = [1] 输出:0
提示:
-
1 <= nums.length <= 5000
-
-1000 <= nums[i] <= 1000
思路分析
求子数组的数量!从第一个数字开始,长度达到 3 就可以成为一个等差数组。计算出“头两个元素”的差值,后续的元素与前一个元素的差值等于上面计算出来的差值,即可成为一个等差数组。
可以用滑动窗口!
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2025-08-04 21:13:37
*/
public int numberOfArithmeticSlices(int[] nums) {
Set<String> memo = new HashSet<>();
for (int i = 2; i < nums.length; i++) {
dfs(nums, memo, nums[i - 1] - nums[i - 2], i - 2, i);
}
return memo.size();
}
private void dfs(int[] nums, Set<String> memo, int diff, int start, int next) {
if (next >= nums.length) {
return;
}
if (nums[next] - nums[next - 1] == diff) {
memo.add(start + "/" + next);
dfs(nums, memo, diff, start, next + 1);
}
}
参考资料
-
413. 等差数列划分 - 官方题解 — 从这个题解来看,我的写法还可以再简化!不需要做深度优先遍历,一个循环即可。