Problem: Rotate an Array
Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.
Example:
Input:
nums = [1,2,3,4,5,6,7], k = 3
Output:
[5,6,7,1,2,3,4]
Explanation:
- Rotate 1 step to the right:
[7,1,2,3,4,5,6] - Rotate 2 steps to the right:
[6,7,1,2,3,4,5] - Rotate 3 steps to the right:
[5,6,7,1,2,3,4]
Approach:
-
Reverse the Entire Array: First, reverse the entire array. This step moves the elements into the reverse order.
-
Reverse the First
kElements: After reversing the entire array, the firstkelements should be reversed to restore the correct order. -
Reverse the Remaining Elements: Finally, reverse the remaining
numsSize - kelements to bring them into the correct order. -
Modulo Operation: If
kis greater than or equal tonumsSize, we usek = k % numsSizeto handle rotations that go beyond the array size.
C Code Solution:
#include <stdio.h>
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; // In case k is larger than numsSize
reverse(nums, 0, numsSize - 1); // Reverse the entire array
reverse(nums, 0, k - 1); // Reverse the first k elements
reverse(nums, k, numsSize - 1); // Reverse the rest of the array
}
int main() {
int nums[] = {1, 2, 3, 4, 5, 6, 7};
int numsSize = sizeof(nums) / sizeof(nums[0]);
int k = 3;
rotate(nums, numsSize, k);
printf("Rotated array: ");
for (int i = 0; i < numsSize; i++) {
printf("%d ", nums[i]);
}
printf("n");
return 0;
}
Explanation of Code:
-
Reverse Function:
- The
reversefunction takes the array and two indices (startandend). It swaps the elements at thestartandendindices and keeps moving towards the center, effectively reversing the portion of the array.
- The
-
Rotate Function:
- First,
k = k % numsSizeensures thatkis within the array bounds (i.e., no need to rotate more than the size of the array). - The array is then reversed in three steps:
- Reverse the entire array.
- Reverse the first
kelements. - Reverse the remaining elements from index
ktonumsSize - 1.
- First,
-
Main Function:
- Initializes the array and calls the
rotatefunction. It then prints the rotated array.
- Initializes the array and calls the
Time and Space Complexity:
- Time Complexity: O(n)O(n), where nn is the number of elements in the array. We reverse the entire array and its sections, which requires linear time.
- Space Complexity: O(1)O(1), as we modify the array in place without using any additional space.
Example Walkthrough:
Example 1:
Input:
nums = [1, 2, 3, 4, 5, 6, 7], k = 3
-
Reverse the Entire Array:
[1, 2, 3, 4, 5, 6, 7] -> [7, 6, 5, 4, 3, 2, 1] -
Reverse the First
k = 3Elements:[7, 6, 5, 4, 3, 2, 1] -> [5, 6, 7, 4, 3, 2, 1] -
Reverse the Remaining Elements:
[5, 6, 7, 4, 3, 2, 1] -> [5, 6, 7, 1, 2, 3, 4]
Output:
[5, 6, 7, 1, 2, 3, 4]
Example 2:
Input:
nums = [-1, -100, 3, 99], k = 2
-
Reverse the Entire Array:
[-1, -100, 3, 99] -> [99, 3, -100, -1] -
Reverse the First
k = 2Elements:[99, 3, -100, -1] -> [3, 99, -100, -1] -
Reverse the Remaining Elements:
[3, 99, -100, -1] -> [3, 99, -1, -100]
Output:
[3, 99, -1, -100]
