题目:轮转数组

解法一:

思路比较简单,仅仅是将移动后的元素存放到另一个数组

具体实现:

因为轮转的特性,每当移动的次数是数组大小的整数倍时,就相当于完全没有变化,使所以直接返回

之后再通过一轮遍历,将原数组中的元素进行移动即可

rotate()

 1// 解法一:
 2void rotate(vector<int>& nums, int k)
 3{
 4    int sz = nums.size();
 5    if(k % sz == 0) return;
 6
 7    std::vector<int> vec(sz, 0);
 8    for(int i = 0; i < sz; i++)
 9    {
10        int index = (i + k) % sz;
11        vec[index] = nums[i];
12    }
13    nums = vec;
14}

解法二:

PS:突然发现我可能是个傻逼😅😅😅😅😅😅😅😅😅😅😅😅😅😅

参考了这里的解法:189. 轮转数组 - 力扣(LeetCode)

思路如下:

假设现在有一个数组[1,2,3,4,5,6,7],需要变换成[5,6,7,1,2,3,4]

可以将转换后的数组视为:[5,6,7] + [1,2,3,4]

首先要确保的是[5,6,7]在[1,2,3,4]前面,这可以通过翻转整个数组得到——> [7,6,5,4,3,2,1]

之后就只需要对[7,6,5] 和 [4,3,2,1]两个子数组进行翻转就可以得到最终的结果

如此,即可将复杂的移动操作转换为反转操作

rotate()

1// 解法二:
2void rotate(vector<int>& nums, int k)
3{
4    k %= nums.size();
5    ranges::reverse(nums);
6    std::reverse(nums.begin(), nums.begin() + k);
7    std::reverse(nums.begin() + k, nums.end());
8}

来源:语雀原笔记