Welcome to Subscribe On Youtube
3865. Reverse K Subarrays 🔒
Description
You are given an integer array nums of length n and an integer k.
You must partition the array into k contiguous subarrays of equal length and reverse each subarray.
It is guaranteed that n is divisible by k.
Return the resulting array after performing the above operation.
Example 1:
Input: nums = [1,2,4,3,5,6], k = 3
Output: [2,1,3,4,6,5]
Explanation:
- The array is partitioned into
k = 3subarrays:[1, 2],[4, 3], and[5, 6]. - After reversing each subarray:
[2, 1],[3, 4], and[6, 5]. - Combining them gives the final array
[2, 1, 3, 4, 6, 5].
Example 2:
Input: nums = [5,4,4,2], k = 1
Output: [2,4,4,5]
Explanation:
- The array is partitioned into
k = 1subarray:[5, 4, 4, 2]. - Reversing it produces
[2, 4, 4, 5], which is the final array.
Constraints:
1 <= n == nums.length <= 10001 <= nums[i] <= 10001 <= k <= nnis divisible byk.
Solutions
Solution 1: Simulation
Since we need to partition the array into $k$ subarrays of equal length, the length of each subarray is $m = \frac{n}{k}$. We can use a loop to traverse the array with a step size of $m$, and in each iteration, reverse the current subarray.
The time complexity is $O(n)$, where $n$ is the length of the array $\textit{nums}$. The space complexity is $O(1)$, as we only use a constant amount of extra space.
-
class Solution { public int[] reverseSubarrays(int[] nums, int k) { int n = nums.length; int m = n / k; for (int i = 0; i < n; i += m) { int l = i, r = i + m - 1; while (l < r) { int t = nums[l]; nums[l++] = nums[r]; nums[r--] = t; } } return nums; } } -
class Solution { public: vector<int> reverseSubarrays(vector<int>& nums, int k) { int n = nums.size(); int m = n / k; for (int i = 0; i < n; i += m) { int l = i, r = i + m - 1; while (l < r) { swap(nums[l++], nums[r--]); } } return nums; } }; -
class Solution: def reverseSubarrays(self, nums: list[int], k: int) -> list[int]: n = len(nums) m = n // k for i in range(0, n, m): nums[i : i + m] = nums[i : i + m][::-1] return nums -
func reverseSubarrays(nums []int, k int) []int { n := len(nums) m := n / k for i := 0; i < n; i += m { l, r := i, i+m-1 for l < r { nums[l], nums[r] = nums[r], nums[l] l++ r-- } } return nums } -
function reverseSubarrays(nums: number[], k: number): number[] { const n = nums.length; const m = Math.floor(n / k); for (let i = 0; i < n; i += m) { let l = i, r = i + m - 1; while (l < r) { const t = nums[l]; nums[l++] = nums[r]; nums[r--] = t; } } return nums; } -
impl Solution { pub fn reverse_subarrays(mut nums: Vec<i32>, k: i32) -> Vec<i32> { let n = nums.len(); let m = n / k as usize; for i in (0..n).step_by(m) { let mut l = i; let mut r = i + m - 1; while l < r { nums.swap(l, r); l += 1; r -= 1; } } nums } }