难度:mid
题目描述
示例
某年408数据结构大题
解法1:模拟,暴力出奇迹
一位一位的换,很显然会超时
void rotate(int* nums, int numsSize, int k) {
// 模拟
k = k % numsSize;
int temp, i, j;
// 循环右移一位,相当于把最后一个移到第一位,后面的全部后移一位
for(i = 0; i < k; i ++){
temp = nums[numsSize-1];
for(j = numsSize-1; j > 0; j --) // 后面的全部后移一位
nums[j] = nums[j-1];
nums[0] = temp;
}
}
显然暴力的最终结果就是超时
提前将k值模一下,模完后还是会超时,焯!
解法2:数组翻转
这个思路不好想,看了题解才知道这么写的。附上链接:leetcode.cn/problems/ro…
这个大佬的图做的针不戳
第一步翻转整个数组;第二步从k处分割为两个数组;第三步两个子数组再各自翻转
// 数组reverse
void reverse(int* nums, int l, int r){
int temp;
while(l < r){
// swap
temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
void rotate(int* nums, int numsSize, int k) {
// 某年408的数据结构大题
// 循环移位
// 第一步:整体翻转
// 7 6 5 4 3 2 1
reverse(nums, 0, numsSize-1);
//第二步: 从k处切割
k = k % numsSize; // 防止k值过大
//第三步:子数组再各自翻转
reverse(nums,0, k-1);
reverse(nums, k, numsSize-1);
}
时间复杂度: