【LeetCode:3101. 交替子数组计数 + 滑动窗口 + 数学公式】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |


🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 滑动窗口 + 数学公式](#⚡ 滑动窗口 + 数学公式)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

给你一个二进制数组nums 。

如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。

返回数组 nums 中交替子数组的数量。

示例 1:

输入: nums = 0,1,1,1

输出: 5

解释:

以下子数组是交替子数组:0111 以及 0,1

示例 2:

输入: nums = 1,0,1,0

输出: 10

解释:

数组的每个子数组都是交替子数组。可以统计在内的子数组共有 10 个。

提示:

1 <= nums.length <= 105

numsi 不是 0 就是 1 。

🌟 求解思路&实现代码&运行结果


⚡ 滑动窗口 + 数学公式

🥦 求解思路
  1. 通过读取题目的意思可以知道,要想求解本题,实质是找到有多少子数组中存在多少个两个相邻元素的值不相同的情况,假设来到当前的位置,此时我们想要知道的是,以它为开头的子数组中,存在多少个相邻元素不相同的情况。可以通过滑动窗口来求解。
  2. 在去寻找有多少个相同元素不同的过程中,我们通过一个变量来记录形如 01 或者 10 的个数有多少个。为什么呢?大家可以多举一些情况,注意,此时不考虑单独的情况, 这种情况我们直接累加到最后的结果即可。假设形如 01 ,此时贡献为1;形如010,贡献为3;形如0101,贡献为6,形如01010,贡献为10,依次类推,得到每次贡献的数值公式为 cnt * (cnt + 1) / 2。
  3. 最后,加上每一个字符的情况,也就是字符串的长度,直接返回即可。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下递归和迭代的解法。
🥦 实现代码
java 复制代码
class Solution {
    public long countAlternatingSubarrays(int[] nums) {
        long ans = 0;
        int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
            int ori = nums[right];
            long cnt = 0;
            while (right < n - 1 && ori != nums[right + 1]) {
                cnt++;
                ori = nums[right + 1];
                right++;
            }
            ans += cnt * (cnt + 1) / 2;
            left = right;
        }
        return ans + n;
    }
}
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
青山木2 分钟前
Hot 100 --- LRU 缓存
java·数据结构·算法·leetcode·链表·缓存·哈希
“码”力全开3 分钟前
ONVIF摄像头接入项目实战记录
人工智能·算法·边缘计算
花生了什么事o4 分钟前
Java 线程池:从参数到拒绝策略
java·jvm
长孙豪翔15 分钟前
引发事件的问题
java·linux·数据库
happyprince17 分钟前
09-vLLM KV Cache 系统完整分析
java·spring·vllm
掉鱼的猫17 分钟前
ReActAgent 使用指南:构建会思考、能行动的 AI Agent
java·llm·agent
pp起床19 分钟前
黑马点评 - 短信验证码登录实现
java·开发语言·tomcat
CodeStats29 分钟前
《源纹天书》第121-125章:源匠归来——全栈重构与归元圣域的2.0时代
java·开发语言·源纹天书
AI人工智能+电脑小能手30 分钟前
【大白话说Java面试题 第154题】【06_Spring篇】第14题:Spring 支持的 Bean 作用域
java·开发语言·spring·面试
AI科技星31 分钟前
公理化数学化学|48小时确权终稿(完整投产包)
人工智能·数学·算法·重构·拓扑学·乖乖数学·全域数学