type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 27, 2025 03:30 PM
给你一个下标从 0 开始的整数数组
nums
。每次操作中,你可以:- 选择两个满足
0 <= i, j < nums.length
的不同下标i
和j
。
- 选择一个非负整数
k
,满足nums[i]
和nums[j]
在二进制下的第k
位(下标编号从 0 开始)是1
。
- 将
nums[i]
和nums[j]
都减去2k
。
如果一个子数组内执行上述操作若干次后,该子数组可以变成一个全为
0
的数组,那么我们称它是一个 美丽 的子数组。请你返回数组
nums
中 美丽子数组 的数目。子数组是一个数组中一段连续 非空 的元素序列。
位运算——与或(AND/OR)
暴力做法
哈希表
本来是根据前缀和和异或的性质,求数组中有多少数对满足
s[l] ^ s[r + 1] = 0
暴力运算的结果
上面的朴素运算会超时。而本质上是
s[r + 1] == s[l]
,也就是前缀和数组中有多少相等的数对。我们参考 1. 两数之和 的做法,使用哈希表保存之前的出现的数字,后面出现相同数,直接加上次数。优化了时间复杂度。先前缀和,后循环计算
边计算,边循环计算
📎 参考
- 无