题目描述
给定一个排列数组 a,判断元素 x 和 y 是否相邻。排列是长度为 n 的数组,其中每个数字从 1 到 n 恰好出现一次。
问题分析
-
核心思路
- 找出 x 和 y 在数组中的索引。
- 检查索引的绝对差值是否为 1。
-
解决步骤
- 遍历数组,找到 x 和 y 的索引。
- 比较两个索引值是否相邻。
- 返回判断结果。
二、代码实现
C++ 实现:
#include <iostream>
#include <vector>
#include <cmath> // abs() 函数
using namespace std;
// 判断 x 和 y 是否相邻
bool solution(int n, vector<int> a, int x, int y) {
int index_x = -1, index_y = -1;
// 遍历数组找到 x 和 y 的索引
for (int i = 0; i < n; ++i) {
if (a[i] == x) index_x = i;
if (a[i] == y) index_y = i;
if (index_x != -1 && index_y != -1) break; // 找到即可退出循环
}
// 判断索引是否相邻
return abs(index_x - index_y) == 1;
}
int main() {
cout << (solution(4, {1, 4, 2, 3}, 2, 4) == true) << endl;
cout << (solution(5, {3, 4, 5, 1, 2}, 3, 2) == false) << endl;
cout << (solution(6, {6, 1, 5, 2, 4, 3}, 5, 2) == true) << endl;
return 0;
}
三、知识总结
C++ 知识点
-
数组遍历
使用for循环查找目标元素的索引:for (int i = 0; i < n; ++i) { if (a[i] == x) index_x = i; if (a[i] == y) index_y = i; }时间复杂度为 O(n)。
-
绝对值函数
abs()函数在<cmath>头文件中,计算两索引的差值:return abs(index_x - index_y) == 1; -
输出格式化
条件语句结合cout格式化输出结果:cout << (solution(5, {3, 4, 5, 1, 2}, 3, 2) == false) << endl;
四、个人理解与建议
-
排列特点
排列中元素唯一且完整性明确,减少了复杂度,只需关注索引操作即可。 -
代码简化
可用break提前退出循环,优化性能。 -
理解题目特点
排列的特性让我们可以不用考虑重复值或无效输入,这是降低复杂度的关键。 -
提升解法效率
对于大规模数组,可以尝试用哈希表预处理索引位置,将查找时间复杂度从 O(n) 降低到 O(1)。
五、学习计划
- 基础刷题
每天完成 1-2 道与数组索引相关的问题,锻炼基本逻辑。 - 代码优化
尝试扩展到更大规模数据集,比如用哈希表优化查找操作。 - 错题分析
将错题进行归类总结,分析造成错误的原因。
六、工具运用
-
MarsCode AI
- 通过其代码解析功能验证逻辑正确性。
- 使用 AI 提供的边界测试样例,检查代码健壮性。
-
在线平台
- 利用 LeetCode 或其他在线平台搜索相似问题,扩展知识面。
七、总结
本题是一个基础的数组索引操作问题,关键在于理解排列的特性和索引相邻的数学逻辑。在实现上,通过简单的循环和条件判断即可解决问题,但通过代码优化和测试可以提升代码的效率和可靠性。希望这篇博客能帮助初学者理解类似问题的核心解法,并从中获得启发!