100266. 交替子数组计数

100266. 交替子数组计数

给你一个二进制数组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 <= 10^5

nums[i] 不是 0 就是 1 。

解题思路与代码实现

使用滑动窗口求解

java 复制代码
class Solution {
	
    public long countAlternatingSubarrays(int[] nums) {
        // 双指针,滑动窗口:窗口[left,right)记录当前连续的交替子数组
        long res = 0;
        int left = 0, right = 1;
        while (right < nums.length) {
        	// 如果窗口内不存在 两个 相邻 元素的值 相同 ,扩展右边界
            while (right < nums.length && nums[right] != nums[right - 1]) {
                right++;
            }
            // 累加当前结果并更新窗口
            long len = right - left;	// 用long防止10^5 * 10^5上溢出
            res += (len + 1) * len/ 2;
            left = right++;	// 更新左边界
        }
        // 考虑边界情况,如0,1,1,1,left=3,right=4,直接退出了循环会少算一次
        if (left == nums.length - 1) {
            res++;
        }
        // 返回结果
        return res;
    }
}

踩坑点

最初计算len时用int接收,导致局部用例数据溢出

相关推荐
行百里er4 分钟前
代码跑得慢?让Spring的StopWatch告诉你真相!
java·后端·github
又是忙碌的一天8 分钟前
SpringMVC响应
java·服务器·数据库
梭七y9 分钟前
【力扣hot100题】(133)LRU缓存
leetcode·缓存·哈希算法
万物皆字节17 分钟前
Spring Cloud Gateway 启动流程源码分析
java·开发语言·spring boot
W001hhh19 分钟前
260110
java·数据库
stillaliveQEJ26 分钟前
【JavaEE】Spring IoC(一)
java·spring·java-ee
a程序小傲35 分钟前
得物Java面试被问:方法句柄(MethodHandle)与反射的性能对比和底层区别
java·开发语言·spring boot·后端·python·面试·职场和发展
酒书39 分钟前
对接阿里云号码认证实现运营商一键登录
java·阿里云
独自破碎E42 分钟前
比较版本号
java·开发语言
zimoyin1 小时前
浅浅了解下0拷贝技术
java·linux·开发语言