题目描述:
题号:189
给定一个整数数组 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]
解题思路:
思路一:原地反转(三步)
算法思路:
1、反转整个数组
2、反转数组的前 k 个元素
3、反转数组的 k + 1 到末尾的元素
时间复杂度:O(2N)
空间复杂度:O(1)
C++
// C++
class Solution {
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start += 1;
end -= 1;
}
}
public:
void rotate(vector<int>& nums, int k) {
if(nums.size() == 0 || k < 0) {
return;
}
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};
go
// go
func rotate(nums []int, k int) {
if len(nums) == 0 || k < 0 {
return
}
k %= len(nums)
// 反转切片元素
slices.Reverse(nums)
slices.Reverse(nums[:k])
slices.Reverse(nums[k:])
}