LeetCode 189 Rotate Array(旋转数组)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50600861 翻译通过K步将一个有着n个元素的数组旋转到右侧。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50600861

翻译

通过K步将一个有着n个元素的数组旋转到右侧。

例如,
给定n = 7和k = 3,数组[1,2,3,4,5,6,7]会被旋转成[5,6,7,1,2,3,4]。

批注:
尽你可能尝试多种解决方案,这里至少存在3种不同的方式去解决这个问题。

原文

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

分析

第一种方法

我所想到的第一种方式是另设置一个vector,然后逐个元素添加进去,最后将这个vector赋值给nums。添加方式为将右边的k个元素添加进去,再将左边的n-k个元素添加进去。

具体代码为:

void rotate(vector<int> &nums, int k) {
    if (nums.size() == 1) return;
    if (k > nums.size())  k %= nums.size();
    vector<int> newNums;
    for (int i = nums.size() - k; i < nums.size(); ++i)
        newNums.push_back(nums[i]);
    for (int i = 0; i < nums.size() - k; ++i)
        newNums.push_back(nums[i]);
    nums = newNums;
}

Runtime: 28 ms

超时方法

还有一个最简单的方法,不过妥妥的超时了……

void rotate(vector<int> &nums, int k) {
    if (nums.size() <= 1) return;
    if (k > nums.size()) k %= nums.size();
    while (k > 0) {
        int temp = nums[nums.size() - 1];
        for (int i = nums.size() -1; i >0; --i) {
            nums[i] = nums[i - 1];
        }
        nums[0] = temp;
        k--;
    }
}

Time Limit Exceeded

第二种方法

上面那种方法不行,继续改进第一种方法。同样是将vector切成左右两边。

void rotate(vector<int> &nums, int k) {
    if (nums.size() <= 1) return;
    if (k > nums.size()) k %= nums.size();
    vector<int> extra(nums.begin(), nums.begin() + nums.size() - k);
    nums.erase(nums.begin(), nums.begin() + nums.size() - k);
    nums.insert(nums.end(), extra.begin(), extra.end());
}

Runtime: 28 ms

第二种方法改进

试试颠倒顺序呢?

void rotate(vector<int> &nums, int k) {
    if (nums.size() <= 1) return;
    if (k > nums.size()) k %= nums.size();
    vector<int> extra(nums.end() - k, nums.end());
    nums.erase(nums.end() - k, nums.end());
    nums.insert(nums.begin(), extra.begin(), extra.end());
}

Runtime: 24 ms

要少了4秒呢。

第三种方法

还有一种方法,可以使用STL自带的rotate()函数……

void rotate(vector<int>& nums, int k) {
    int len = nums.size();
    if (len > 1) {
        k %= len;
        std::rotate(nums.begin(), nums.end() - k, nums.end());
    }
}
目录
相关文章
|
1月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
4天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
1月前
|
存储 算法
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
|
1月前
|
存储
力扣刷题-最大子数组和
力扣刷题-最大子数组和
10 1
|
1月前
leetcode2967. 使数组成为等数数组的最小代价
leetcode2967. 使数组成为等数数组的最小代价
20 0
|
1月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
|
1月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
|
1月前
|
算法 搜索推荐
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
|
1月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
30 8
|
1月前
|
算法 测试技术 索引
力扣面试经典题之数组/字符串(二)
力扣面试经典题之数组/字符串(二)
13 0