189. 轮转数组

我的解法:
将最后会被移动到前面的那部分数组先储存在一个数组当中,然后把前半部分移动到后半部分应该存储的位置,然后把新开辟数组中的元素拿出来放入nums数组的前面部分即可。
其中要注意kn取余,减少重复操作。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        vector<int> temp;
        for (int i = n - k; i < n; ++i) {
            temp.push_back(nums[i]);
        }
        for (int i = n - 1; i >= k; --i) {
            nums[i] = nums[i - k];
        }
        for (int i = 0; i < k; ++i) {
            nums[i] = temp[i];
        }
    }
};

其中,注意我之前定义了

vector<int> temp(k + 1);

然后使用push_back添加元素,会把新的元素添加到k+1个元素位置之后,导致最终temp数组长度可能大于k+1,且前k+1个元素为0。

其他解法:

看了题解后,可以直接新开辟一个大小为n的数组,不用计算其大小,直接把nums数组按照规律放进来,然后将这个数组拷贝给nums即可.

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

注意assign函数的使用:assign函数会清除向量当前的内容,并用新的内容替换它。如果目标向量的大小不足以容纳被赋值的内容,它将自动扩展大小以容纳新的元素。

另外,中间的赋值部分可以写成:

for (int i = 0; i < n; ++i) {
	temp[(i + k) % n] = nums[i];
}

另外一种方法就是翻转数组
先将整个数组翻转
然后翻转前k个部分和翻转后n-k个部分

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

    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }
};

你可能感兴趣的:(LeetCode,算法,数据结构,leetcode)