数组的一些问题

在这里插入图片描述
题目解析:
a是一个二维数组,p是一个指针函数,指向有3个int型元素的数组。p = a,a作左值表示a[0]的地址,即&a[0],所以p = a也可以写成p = &a[0]。
答案解析:
A、*(p=2),意思是将2这个地址赋值给指针p,之后解引用p取值,p=2类型不匹配,错。
B、(p+1)+2,意思是指针p+3,指向a[3],数组的第一维只有2,指针p指向了未知空间,错。
C、p[1]+1,p[]是一个一级指针,p[1] = *(p+1)。意思是p先指向下一个,即a[1],解引用是a[1]第一个元素的地址(a[1][0]),+1表示该指针指向a[1][1]的地址空间。对。
D、同C,p[2] = *(p+2),即指向a[2][0]的地址空间,超出数组a的范围。错。

在这里插入图片描述

关于指针和数组的赋值
(1)二位数组

int (*p)[3], a[2][3];
p = &a;    //错的

上面的赋值是错的。p是int (*)[3]类型。而&a代表的是整个二位数组的地址,它的类型应该是int (*p)[2][3]的。改成下面的就对了。

int a[2][3];
int (*p)[2][3] = &a;

(2)一维数组

int a[3], p;
p = a;//对的
p = &a; //错的

a作为左值表示首元素a[0]的地址(&a[0]),它是int类型。
&a作左值表示整个数组的地址,它是int (
)[3]类型。改成下面的就对了

int (*p)[3], a[3];
p = &a;  //对了
树状数组(Binary Indexed Tree,简称 BIT)是一种高效的数据结构,主要用于处理**单点更新和前缀查询**问题。虽然树状数组在处理**RMQ(Range Minimum/Maximum Query,区间最值查询)**问题上不如线段树灵活,但它可以在某些特定条件下优化实现 RMQ 查询。 --- ### 树状数组与 RMQ 的关系 - **RMQ 问题定义**:给定一个数组,在不改变数组元素的前提下,多次查询任意区间 $[l, r]$ 中的最小值或最大值。 - **树状数组的局限性**: - 树状数组天然适合处理**前缀和**、**单点更新**、**前缀查询**。 - 对于 RMQ,树状数组不能直接支持任意区间的最值查询,但可以通过一些技巧间接实现。 --- ### 如何用树状数组解决 RMQ? #### 方法一:预处理每个节点维护子区间的极值 1. 构建一个树状数组,其中每个节点不仅存储前缀和,还存储其管理区间的极值(最大值或最小值)。 2. 查询时通过合并多个节点的极值得到整个区间的极值。 ```python class MaxBIT: def __init__(self, arr): self.n = len(arr) self.tree = [0] * (self.n + 1) for i in range(self.n): self.update(i, arr[i]) def update(self, index, value): index += 1 # BIT索引从1开始 while index <= self.n: if value > self.tree[index]: self.tree[index] = value else: break # 如果当前值不大于已有的最大值,则无需继续更新 index += index & -index def query(self, index): index += 1 res = float('-inf') while index > 0: res = max(res, self.tree[index]) index -= index & -index return res def range_max(self, l, r): return self.query(r) - self.query(l - 1) # 示例 arr = [3, 5, 2, 7, 4] bit = MaxBIT(arr) print(bit.range_max(1, 3)) # 输出 5(区间 [5,2,7] 的最大值) ``` > 注意:这种方法只适用于最大值查询,并且更新操作可能无法覆盖所有路径,需要谨慎使用。 --- ### 方法二:结合其他数据结构 - 若要求同时支持**区间最值查询**和**单点更新**,通常更推荐使用 **线段树**。 - 树状数组更适合**前缀操作**,如求和、计数等。 --- ### 小结 - 树状数组可以用于 RMQ,但不是最优解。 - 在特殊场景下,可以借助树状数组维护子区间的极值来完成 RMQ。 - 更通用的方法是使用 **线段树** 或 **稀疏表(Sparse Table)** 来实现高效的 RMQ 查询。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值