轮转数组

简介

image

题解

方法一:
我们可以使用额外的数组来将每个元素放至正确的位置。用 \(n\) 表示数组的长度,我们遍历原数组,将原数组下标为 \(i\) 的元素放至新数组下标为 \((i+k)  mod  n\) 的位置,最后将新数组拷贝至原数组即可。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> newArr(n);
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        nums.assign(newArr.begin(), newArr.end());
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/rotate-array/solutions/551039/xuan-zhuan-shu-zu-by-leetcode-solution-nipk/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法二:
image

class Solution {
public:
    void reverse(vector<int>& nums, int start, int end) {
        while (start < end) {
            swap(nums[start], nums[end]);
            start += 1;
            end -= 1;
        }
    }

    void rotate(vector<int>& nums, int k) {
        k %= nums.size();
        reverse(nums, 0, nums.size() - 1);
	//接下来两步为恢复顺序
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.size() - 1);
    }
};

posted on 2023-05-22 22:59  sc01  阅读(4)  评论(0编辑  收藏  举报