旋转数组(c语言版):
题目介绍:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
个人认为最简单的一种算法:
方法一: 翻转数组
原数组: [1, 2, 3, 4, 5, 6, 7]
k = 3
反转后的数组: [7, 6, 5, 4, 3, 2, 1]
前k个元素反转后的数组: [5, 6, 7, 4, 3, 2, 1]
旋转后的数组: [5, 6, 7, 1, 2, 3, 4]
void reverse(int *nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
void rotate(int* nums, int numsSize, int k){
k = k % numsSize;
reverse(nums, 0, numsSize - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, numsSize - 1);
}
方法二:使用额外的数组
自己创建一个newArr数组用于存储:
void rotate(int* nums, int numsSize, int k) {
int newArr[numsSize];
for (int i = 0; i < numsSize; ++i) {
newArr[(i + k) % numsSize] = nums[i];
}
for (int i = 0; i < numsSize; ++i) {
nums[i] = newArr[i];
}
}
复杂度分析
- 时间复杂度: O(n),其中 n 为数组的长度。
- 空间复杂度: O(n).