1. 题目背景与核心挑战
这两道LeetCode题目(3314和3315)属于位运算专题的经典题型,主要考察对二进制操作和数组构造的深入理解。题目要求我们根据特定规则构造数组,使得通过位运算得到的结果满足最小化条件。这类问题在实际编程面试中经常出现,尤其是在考察候选人底层计算思维和优化能力时。
位运算问题往往具有以下特点:
- 需要熟练掌握AND(&)、OR(|)、XOR(^)、NOT(~)等基本操作
- 通常存在巧妙的数学规律可以优化暴力解法
- 边界条件处理需要格外小心(特别是涉及二进制位数时)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目解析与解法思路
2.1 题目3314解析
题目3314要求构造一个长度为n的数组arr,使得对于所有0 ≤ i < j < n,arr[i] & arr[j]的值最小。这里的"&"表示按位与操作。
关键观察点:
- 按位与操作的性质:两个数在某一位上同时为1时,结果的该位才会是1
- 要使所有两两与的结果最小,理想情况是所有与操作结果都为0
- 这提示我们可以构造一个数组,其中任何两个数都没有共同的置位位
2.2 解法实现
基于上述观察,我们可以采用以下策略:
- 选择一组互不重叠的二进制数
- 确保每个数只有一位是1,其余都是0
- 这样任意两个数的与操作结果必然为0
具体实现代码(Python):
python复制def construct_min_and_array(n):
return [1 << i for i in range(n)]
这个解法的时间复杂度是O(n),空间复杂度也是O(n),是最优解。
2.3 题目3315解析
题目3315是3314的进阶版,要求构造数组使得所有两两或操作的结果最小。这里的"|"表示按位或操作。
关键差异点:
- 或操作的性质:只要两个数中某一位有1,结果的该位就是1
- 要使或操作结果最小,需要尽可能减少1的出现
- 最理想情况是所有数都相同(这样或操作结果就是数本身)
2.4 解法实现
最优策略是构造一个全0数组,这样所有或操作结果都是0。但题目通常会有额外约束(如数组元素不能全相同),这时需要:
- 使用尽可能少的1
- 让1集中在少数几个数中
- 理想情况是只有一个数为1,其余为0
实现
