原地反转空间复杂度为O(1)是因为仅用固定数量辅助变量(如left、right、temp),不随n增长;避免新建数组和递归,所有操作在原数组上完成。

数组原地反转不需要额外开辟与原数组等长的存储空间,核心是用双指针从两端向中间交换元素,空间复杂度稳定为 O(1)。
为什么原地反转能做到 O(1) 空间复杂度
关键在于只使用固定个数的辅助变量(通常是 2~3 个:左右索引、临时交换变量),不随数组长度 n 增大而增加。即使数组有百万个元素,也只用几个整型变量存下标和暂存值。
- 避免创建新数组(否则空间复杂度为 O(n))
- 避免递归实现(递归调用栈深度为 n/2,空间复杂度退化为 O(n))
- 所有操作直接在原数组内存地址上完成
经典双指针实现(含边界处理)
以 0 为起始下标,left 从头开始,right 从尾开始,每次交换后向中间收缩,直到 left ≥ right:
void reverseArray(int arr[], int n) {
int left = 0;
int right = n - 1;
while (left < right) {
// 交换 arr[left] 和 arr[right]
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}注意:循环条件必须是 left ,不是 ≤,否则奇数长度数组中心元素会被多交换一次(虽不影响结果但属冗余操作)。
语言特性的简化写法(以 Python 为例)
Python 支持元组解包,省去显式 temp 变量,逻辑更简洁,空间开销仍是 O(1):
def reverse_inplace(arr):
left, right = 0, len(arr) - 1
while left < right:
arr[left], arr[right] = arr[right], arr[left]
left += 1
right -= 1该写法本质仍是两变量交换,底层仍需临时栈空间保存一个值,但属于常数级,不改变 O(1) 复杂度结论。
易错点与健壮性建议
- 空数组或单元素数组要能正确处理(while 循环自动跳过,无需额外判断)
- C/C++ 中注意传入数组长度,避免越界访问;Java/Python 需确保传入的是可变对象引用
- 若函数需返回新数组,就不再是“原地”,应另写接口,避免混淆语义

















