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

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

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

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


🍔 目录

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

🚩 题目链接

⛲ 题目描述

给你一个二进制数组nums 。

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

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

示例 1:

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

输出: 5

解释:

以下子数组是交替子数组:[0] 、[1] 、[1] 、[1] 以及 [0,1] 。

示例 2:

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

输出: 10

解释:

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

提示:

1 <= nums.length <= 105

nums[i] 不是 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;
    }
}
🥦 运行结果

💬 共勉

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

相关推荐
爱读源码的大都督14 小时前
天下苦@NonNull久矣,JSpecify总算来了,Spring 7率先支持!
java·后端·架构
火花怪怪14 小时前
LaMer结晶动力学模型
算法
木头没有瓜14 小时前
Slf4j 接口文档左侧菜单有显示,但是点击后空白
java
野犬寒鸦14 小时前
从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
java·数据库·redis·后端·缓存
legendary_bruce15 小时前
【22.2 增强决策树】
算法·决策树·机器学习
cxyxiaokui00115 小时前
还在用 @Autowired 字段注入?你可能正在写出“脆弱”的 Java 代码
java·后端·spring
珹洺15 小时前
Java-Spring入门指南(二十二)SSM整合前置基础
java·开发语言·spring
天天摸鱼的java工程师15 小时前
Java IO 流 + MinIO:游戏玩家自定义头像上传(格式校验、压缩处理、存储管理)
java·后端
程序员小富15 小时前
改了 Nacos 一行配置,搞崩线上支付系统!
java·后端
ʚ希希ɞ ྀ15 小时前
用队列实现栈---超全详细解
java·开发语言·数据结构