文章目录
题目描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
这个问题比较好想,我们就进行模拟就好了:用两个数组进行,一个数组负责从中取数,另一个数组负责存储变化后的数字,当一次变化完成后,数组进行相互赋值操作,该算法时间复杂度为o(k*n),空间复杂度为o(n),那么运行的时间会非常长,时间复杂度和空间复杂度都比较高,那么我们能不能用什么方法进行降低时间复杂度呢?
改进:使用两个数组,并且只进行一次赋值运算操作,即:
代码:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len = nums.size();
int *tmp = new int[len];//开辟一块存储空间
for(int i=0; i<len; i++){
tmp[i] = nums[i];
}
for(int i=0; i<len; i++){
nums[(i+k)%len] = tmp[i];
}
}
};
提交结果显示:
首先我们想一下怎么进行旋转:将数组最后一个元素弹出,然后加入到数组开头的元素,也就是一边进行数据的弹出,一边进行数据的输入,即这个操作是进行限制的数组操作,那么符合这个操作的有对列:一头进行插入数据,一头进行弹出数据,这样一来,我们只需要将数据输入到对列然后进行操作即可,这个时间复杂度变成了0(k),空间复杂度o(n):
class Solution {
public:
void rotate(vector<int>& nums, int k) {
//pop() and then push()
int len = nums.size();
queue<int> que;
for(int i=0; i<len; i++){
que.push(nums[len-i-1]); //将数字倒着存进对列,那么对列就可以进行操作了
}
int tmp = 0;
for(int i=0; i<k; i++){
tmp = que.front();
que.pop();
que.push(tmp);
}
for(int i=0; i<len; i++){
nums[len-i-1] = que.front();
que.pop();
}
}
};
有没有更降低空间复杂度的解法呢?