题目
设计一个算法,将顺序表a的所有元素逆置,要求算法的空间复杂度为 O ( 1 ) O(1) O(1)。
实现代码
# include<iostream>
# include<algorithm>
void reverse(vector<int>& a){
int n=a.size();
int left=0, right=n-1;
while(left<right){
swap(a[left], a[right]);
left++, right--;
}
}
分析
顺序表的逆置操作相对简单,看起来也没什么推导的必要。但有时候将其作为算法中的一个小模块来使用有很好的效果(e.g. 2010年数组循环左移),因此还是有必要记一下的。
此外,本次代码中使用了<algorithm>
头文件中的swap
函数,使用此函数可以简单方便地交换数组中两个元素的值。
如果不使用此函数的话,交换元素通常需要新建一个临时变量,即:
int t = a[left]; // 将[left]中的值存入t, 这样[left]的值就有了备份, 可以随便覆盖
a[left] = a[right]; // 使用[right]覆盖[left], 这样[left]的值就修改完成了
a[right] = t; // 将[right]赋值为之前备份的[left]的值, 完成[right]的值的修改