3209. 子数组按位与值为 K 的数目

Powered by:NEFU AB-IN

Link

文章目录

  • 3209. 子数组按位与值为 K 的数目
    • 题意
    • 思路
    • 代码

3209. 子数组按位与值为 K 的数目

题意

给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中有多少个
子数组
满足:子数组中所有元素按位 AND 的结果为 k 。

思路

  1. st+二分

    https://leetcode.cn/problems/number-of-subarrays-with-and-value-of-k/solutions/2833382/stbiao-er-fen-by-time-v5-4qtm/
    细节在于:

    1. 由于一直and操作是非递减的,所以取个负号,这样就是非递增了,能配合bisect_left函数
    2. bisect_left 函数,可以直接这么用 l = bisect_left(range(i, n), -k, key=lambda r: -st.query(i, r)),直接在 range(i, n) 上进行二分查找,通过 key 参数动态计算按位与结果,会快很多(不过这是 3.10 引进的特性),当然我也会自己实现
      1. range(i, n) 生成从 i 到 n-1 的索引序列。
      2. -k 是要插入的元素,它是 k 的相反数。
      3. key=lambda r: -st.query(i, r) 是自定义的比较函数,用于对 range(i, n) 中的每个元素 r 进行比较。它将 st.query(i, r) 的结果取反,实际上是在对 -st.query(i, r) 进行比较。
        相当于
    and_results = [-st.query(i, r) for r in range(i, n)]
    l = bisect_left(and_results, -k)
    r = bisect_right(and_results, -k)
    ans += r - l
    
  2. 滚动数组 + 哈希 + dp

    1. 我们使用一个二维数组 dp 来记录以每个位置结尾的所有可能的按位 AND 结果及其出现次数。定义 dp[i][j] 为以 nums[i] 结尾的子数组中,按位 AND 结果为 j 的子数组数量。
    2. 初始化,dp[0][nums[0]] = 1:表示第一个元素单独形成一个子数组,且按位 AND 结果为 nums[0]。
    3. 对于每个元素 nums[i],我们需要遍历之前所有的状态来更新当前状态: d p [ i ] [ n u m s [ i ] & k e y ] + = d p [ i − 1 ] [ k e y ] dp[i][nums[i]\&key]+=dp[i−1][key] dp[i][nums[i]&key]+=dp[i1][key]
    4. 由于每一层的状态仅依赖于前一层的状态,因此我们可以使用滚动数组来优化空间复杂度。

代码

'''
Author: NEFU AB-IN
Date: 2024-07-06 21:52:11
FilePath: \LeetCode\CP134_2\d\d.py
LastEditTime: 2024-07-08 16:31:44
'''
# 3.8.19 import
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, fabs, floor, gcd, log, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin
from typing import Any, Dict, List, Tuple, TypeVar, Union# Constants
TYPE = TypeVar('TYPE')
N = int(2e5 + 10)  # If using AR, modify accordingly
M = int(20)  # If using AR, modify accordingly
INF = int(2e9)
OFFSET = int(100)# Set recursion limit
setrecursionlimit(INF)class Arr:array = staticmethod(lambda x=0, size=N: [x] * size)array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)])graph = staticmethod(lambda size=N: [[] for _ in range(size)])@staticmethoddef to_1_indexed(data: Union[List, str, List[List]]):"""Adds a zero prefix to the data and returns the modified data and its length."""if isinstance(data, list):if all(isinstance(item, list) for item in data):  # Check if it's a 2D arraynew_data = [[0] * (len(data[0]) + 1)] + [[0] + row for row in data]return new_data, len(new_data) - 1, len(new_data[0]) - 1else:new_data = [0] + datareturn new_data, len(new_data) - 1elif isinstance(data, str):new_data = '0' + datareturn new_data, len(new_data) - 1else:raise TypeError("Input must be a list, a 2D list, or a string")class Str:letter_to_num = staticmethod(lambda x: ord(x.upper()) - 65)  # A -> 0num_to_letter = staticmethod(lambda x: ascii_uppercase[x])  # 0 -> Aremoveprefix = staticmethod(lambda s, prefix: s[len(prefix):] if s.startswith(prefix) else s)removesuffix = staticmethod(lambda s, suffix: s[:-len(suffix)] if s.endswith(suffix) else s)class Math:max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)class IO:input = staticmethod(lambda: stdin.readline().rstrip("\r\n"))read = staticmethod(lambda: map(int, IO.input().split()))read_list = staticmethod(lambda: list(IO.read()))class Std:@staticmethoddef find(container: Union[List[TYPE], str], value: TYPE):"""Returns the index of value in container or -1 if value is not found."""if isinstance(container, list):try:return container.index(value)except ValueError:return -1elif isinstance(container, str):return container.find(value)@staticmethoddef pairwise(iterable):"""Return successive overlapping pairs taken from the input iterable."""a, b = tee(iterable)next(b, None)return zip(a, b)@staticmethoddef bisect_left(a, x, key=lambda y: y):"""The insertion point is the first position where the element is not less than x."""left, right = 0, len(a)while left < right:mid = (left + right) // 2if key(a[mid]) < x:left = mid + 1else:right = midreturn left@staticmethoddef bisect_right(a, x, key=lambda y: y):"""The insertion point is the first position where the element is greater than x."""left, right = 0, len(a)while left < right:mid = (left + right) // 2if key(a[mid]) <= x:left = mid + 1else:right = midreturn leftclass SparseTable:def __init__(self, data: list, func=lambda x, y: x | y):"""Initialize the Sparse Table with the given data and function."""self.func = funcself.st = [list(data)]i, n = 1, len(self.st[0])while 2 * i <= n:pre = self.st[-1]self.st.append([func(pre[j], pre[j + i]) for j in range(n - 2 * i + 1)])i <<= 1def query(self, begin: int, end: int):"""Query the combined result over the interval [begin, end]."""lg = (end - begin + 1).bit_length() - 1return self.func(self.st[lg][begin], self.st[lg][end - (1 << lg) + 1])# ————————————————————— Division line ——————————————————————
class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:st = Std.SparseTable(nums, func=lambda x, y: x & y)ans =  0n = len(nums)for i in range(n):l = Std.bisect_left(range(i, n), -k, key=lambda r: -st.query(i, r))r = Std.bisect_right(range(i, n), -k, key=lambda r: -st.query(i, r))ans += r - lreturn ansclass Solution:def countSubarrays(self, nums: List[int], k: int) -> int:nums, n = Arr.to_1_indexed(nums)dp = Counter()res = 0for i in range(1, n + 1):cur_dp = Counter()cur_dp[nums[i]] += 1for num, val in dp.items():# 转移方程cur_dp[nums[i] & num] += valres += cur_dp[k]dp = cur_dpreturn res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Tools】wxapkg是什么格式的文件

我白天是个 搞笑废物 表演不在乎 夜晚变成 忧伤怪物 撕扯着孤独 我曾经是个 感性动物 小心地感触 现在变成 无关人物 &#x1f3b5; 张碧晨/王赫野《何物》 wxapkg 是微信小程序的包文件格式。它是微信小程序的代码和资源打包后的文件&#xff0c;用于发布…

新增多种图表类型,新增插件管理模块,DataEase开源数据可视化分析工具v2.8.0发布

2024年7月8日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.8.0版本。 这一版本的功能变动包括&#xff1a;图表方面&#xff0c;新增组合图、热力地图、符号地图、K线图等图表类型&#xff0c;并对已有的仪表盘、明细表、指标卡、富文本等图表类型进行了功…

【已解决】微信小程序报错:request 合法域名校验出错 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息”

场景复现 最近在写微信小程序时&#xff0c;打开开发者工具会出现一下报错&#xff0c;甚至连手机移动端使用时也会出现“网络出错了”这样的错误提示。 解决方法 查看微信官方的文档和网上的一些解决方法&#xff0c;可以按照下面的图文步骤进行设置&#x1f447;&#x1f4…

caeses软件许可优化解决方案

Caeses软件介绍 CAESES是一款十分很不错的三维建模仿真的软件。它功能很大、优化效率高、可以自动化优化、分析工具快速 CAESES拥有多种不同的试验设计及单目标、多目标优化算法&#xff0c;能够根据仿真计算评估的结果。软件可以帮助用户轻松的打造出自各种船舶、汽车、航空航…

Lambda是个什么东西?如何理解和使用?

目录 lambda 的作用 为什么有 lambda 如何使用 lambda 示例 lambda 是 Python 中的一个关键字&#xff0c;用于创建匿名函数&#xff08;也称为 lambda 函数&#xff09;。匿名函数是一种简单的、可以在需要函数对象的地方立即定义的函数。这些函数主要用于定义简单的、一次…

Ai Native应用开发(一)--数字人

背景 刚参加完24年世界人工智能大会&#xff08;WAIC&#xff09;&#xff0c;聊聊自己的一些感受。这次会明显比去年多很多人&#xff0c;用人山人海来形容应该也不为过。根据我自己粗浅观察参会的人员也比去年更多样化。去年更多还是从业者或者是这块研究人员。今年每个论坛…

sql盲注

文章目录 布尔盲注时间盲注 布尔盲注 介绍&#xff1a;在网页只给你两种回显的时候是用&#xff0c;类似于布尔类型的数据&#xff0c;1表示正确&#xff0c;0表示错误。 特点&#xff1a;思路简单&#xff0c;步骤繁琐且麻烦。 核心函数&#xff1a; length()函数substr()函…

day4单向链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { node_p Lcreate_head();//创建链表 printf("########################链表的头插尾插\n"); insert_head(L,45);//头插 insert_head(L,45); insert_tail(L,45);/…

Go-Zero 框架使用 MongoDB,数据采集入库如此简单

目录 引言 环境准备 如何使用 main入口代码实现 实现采集网络接口 总结 其他资源 引言 Go-Zero 是一个高性能、可扩展的微服务框架&#xff0c;专为 Go 语言设计。它提供了丰富的功能&#xff0c;如 RPC、RESTful API 支持、服务发现、熔断器、限流器等&#xff0c;使开…

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存 1、效果图 2、流程 1、获取摄像头资源,打开摄像头 2、截取图像 3、opencv读的通道是BGR,要转成RGB 4、往显示视频的Label里显示QImage 5、将QImage转换为PIL图像,并保存到缓存 6、获取图像中人脸信息3、代码 # -*- codin…

面试题 04. 二维数组中的查找

二维数组中的查找 题目描述示例:限制&#xff1a; 题解方法一 二分查找 题目描述 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个…

2024年【安全员-C证】考试及安全员-C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证免费试题全真模…

【trition-server】pytorch 文档:使用 Triton 提供 Torch-TensorRT 模型

Serving a Torch-TensorRT model with Triton pytorch 的官方文档: Serving a Torch-TensorRT model with Triton 在有关机器学习基础设施的讨论中,优化和部署是密不可分的。一旦完成网络级优化以获得最大性能,下一步就是部署它。 然而,提供这种优化模型也有其自身的一系列…

论文解析——Full Stack Optimization of Transformer Inference: a Survey

作者及发刊详情 摘要 正文 主要工作贡献 这篇文章的贡献主要有两部分&#xff1a; 分析Transformer的特征&#xff0c;调查高效transformer推理的方法通过应用方法学展现一个DNN加速器生成器Gemmini的case研究 1&#xff09;分析和解析Transformer架构的运行时特性和瓶颈…

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、网络维护成本高&#xff0c;堆叠技术将多台交换机虚拟成一台交换机&#xff0c;达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…

怀庄之醉适合搭配什么食物?

怀庄之醉作为一种独特的佳酿&#xff0c;其丰富的香气和层次感使其能够与多种食物搭配&#xff0c;提升餐饮体验。以下将具体探讨怀庄之醉适合搭配的食物类型&#xff0c;并分析为何这些搭配能够带来卓越的味觉享受。 一、肉类佳肴 怀庄之醉因其浓郁的口感&#xff0c;特别适…

Linux--线程(概念篇)

目录 1.背景知识 再谈地址空间&#xff1a; 关于页表&#xff08;32bit机器上&#xff09; 2.线程的概念和Linux中线程的实现 概念部分&#xff1a; 代码部分&#xff1a; 问题&#xff1a; 3.关于线程的有点与缺点 4.进程VS线程 1.背景知识 再谈地址空间&#xff1a…

A59 STM32_HAL库函数 之 TIM扩展驱动 -- A -- 所有函数的介绍及使用

A59 STM32_HAL库函数 之 TIM扩展驱动 -- A -- 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_TIMEx_HallSensor_Init1.2 HAL_TIMEx_HallSensor_DeInit1.3 HAL_TIMEx_HallSensor_MspInit1.4 HAL_TIMEx_HallSensor_MspDeInit1.5 HAL_TIMEx_HallSensor_Start1.6 HAL_TIMEx_HallSe…

echars根据geojson地块坐标数据coordinates计算地图地块的中心点

echarts地图根据地块名称获取地块的中心坐标。实现在中心位置放置标记。 需要放置数据的地块名称的数据格式&#xff1a; mapData: [ {name: 江苏省, value: 500}, {name: 上海市, value: 10} ], 计算中心代码: // this.geoData是中国地图的geojson格式数据// …

Linux中的粘滞位及mysql日期函数

只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写 权限. 为了解决这个不科学的问题, Linux引入了粘滞位的概念. 粘滞位 当一个目录被设置为"粘滞位"(用chmod t),则该目录下的文件只能由 一、超级管理员删除 二、该目录…