leetcode-413. 等差数列划分(java)

news/2024/7/5 1:47:11

等差数列划分

  • leetcode-413. 等差数列划分
    • 题目描述
    • 双指针
  • 上期经典算法

leetcode-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

在这里插入图片描述

双指针

这道题,我们先求出有连续符合要求的子序列的个数。
可以用双指针,一个卡住左指针,一个指针向右滑动,然后用等差数列求和公式求出个数就行了。

具体的,我们可以枚举 i 作为差值为 d 的子数组的左端点,然后通过「双指针」的方式找到当前等差并最长的子数组的右端点 j,令区间 [i,j]长度为 len。
那么显然,符合条件的子数组的数量为:
cnt=∑k=3lencountWithArrayLength(k)

函数 int countWithArrayLength(int k) 求的是长度为 k 的子数组的数量。
不难发现,随着入参 k 的逐步减小,函数返回值逐步增大。
因此上述结果 cnt其实是一个 首项为 1,末项为 len−3+1,公差为 1 的等差数列的求和结果。直接套用「等差数列求和」公式求解即可。

代码

  /**
     * 等差数列的个数
     * @param nums
     * @return
     */
    public int numberOfArithmeticSlices(int[] nums) {
        //保存答案
        int ans = 0;
        if (nums.length < 3){
            return ans;
        }

        for (int i = 0; i < nums.length - 2;){
            int j = i;
            //等差
            int dn = nums[j + 1] - nums[j];
            //找到满足等差数列的右边界
            while (j + 1 < nums.length && dn == (nums[j + 1] - nums[j])){
                j++;
            }
            //子数组的长度
            int ln = j - i + 1;
            //最短长度是3 计算子数组个数
            int an = ln - 3 + 1;
            //等差数列个数  求和公式
            int cnt = (1 + an) * an / 2;
            ans += cnt;
            i = j;
        }
        return ans;
    }

上期经典算法

leetcode611. 有效三角形的个数


http://lihuaxi.xjx100.cn/news/1451675.html

相关文章

TiDB数据库的安装配置

一、 TiDB 软件和硬件环境建议配置 Linux 操作系统版本要求 Linux 操作系统 版本 Red Hat Enterprise Linux 7.3 及以上的 7.x 版本 CentOS 7.3 及以上的 7.x 版本 Oracle Enterprise Linux 7.3 及以上的 7.x 版本 Amazon Linux 2 Ubuntu LTS 16.04 及以上的版本 …

UE4/UE5 照明构建失败 “Lightmass crashed”解决“数组索引越界”

在构建全局光照时,经常会出现“Lightmass crashed”的错误,导致光照构建失败。本文将分析这一问题的原因,并给出解决建议。 UE4 版本4.26 报错如下: <None> === Lightmass crashed: === Assertion failed: (Index >= 0) & (Index < ArrayNum) [File:d:\build…

Python入门--变量和数据类型

什么是变量&#xff1f; 在编程中&#xff0c;变量是指内存中的一段存储空间&#xff0c;用于存储数据。使用变量可以方便地存储数据并在程序中进行操作。 如何定义变量&#xff1f; 在Python中&#xff0c;可以使用“”符号来定义变量&#xff0c;例如&#xff1a; a 1 b …

如何选择专业的化妆品专柜神秘顾客公司(北京神秘顾客)

选择专业的化妆品专柜第三方神秘顾客公司需要仔细考虑&#xff0c;以确保您选择与之合作的公司能够提供有价值的见解和高质量的服务。以下是选择化妆品专柜专业神秘顾客公司时应考虑的关键因素&#xff1a; 1、声誉和经验&#xff1a;选择在行业内声誉良好且经验丰富的商超神秘…

vector【2】模拟实现(超详解哦)

vector 引言&#xff08;实现概述&#xff09;接口实现详解默认成员函数构造函数析构函数赋值重载 迭代器容量size与capacityreserveresizeempty 元素访问数据修改inserterasepush_back与pop_backswap 模拟实现源码概览总结 引言&#xff08;实现概述&#xff09; 在前面&…

Smartbi 修改用户密码漏洞

漏洞简介 通过查看 Smartbi 的补丁包信息&#xff0c;发现存在漏洞在某种特定情况下修改用户的密码&#xff0c;进行简单的复现和分析 漏洞复现 在页面上修改密码时&#xff0c;需要知道原本的用户对应的密码 直接构造这样的数据包&#xff0c;就不需要知道原本的密码&#x…

文件的导入与导出

文章目录 一、需求二、分析1. Excel 表格数据导出2. Excel 表格数据导入一、需求 在我们日常开发中,会有文件的导入导出的需求,如何在 vue 项目中写导入导出功能呢 二、分析 以 Excel 表格数据导出为例 1. Excel 表格数据导出 调用接口将返回的数据进行 Blob 转换,附: 接…

【Java】BF算法(串模式匹配算法)

☀️ 什么是BF算法 BF算法&#xff0c;即暴力算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个与模式串T的第一个字符串进行匹配&#xff0c;若相等&#xff0c;则继续比较S的第二个字符和T的第二个字符&#xff1b;若不相等&#xff0c;则…