15 轮转数组
给定一个整数数组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]
示例 2:
输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释:向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
提示:
1 <= nums.length <= 105-231 <= nums[i] <= 231 - 10 <= k <= 105
进阶:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)的原地算法解决这个问题吗?
思路:环形链表
1、检查参数的合法性
2、计算数组的长度n,轮转大小为k(k有可能大于n,真实的k=k%n)
3、创建一个新的vector ,创建一个指针point,指向数组的k位置,point=k
4、从point指针开始循环一圈数组,放入新的vercor中
5、返回新的vector
class Solution { public: void rotate(vector<int>& nums, int k) { int n=nums.size(); if(n<2||k<=0) return; vector<int> _temp(n,0); int i=k%n; int begin=0; do{ _temp[i++%n]=nums[begin++]; }while(begin!=n); nums.swap(_temp); } };数组翻转
思路
1、创建一个翻转vector的函数
2、翻转整个数组
3、翻转0到k-1的位置
4、翻转k到size-1的位置
class Solution { public: void rotate(vector<int>& nums, int k) { int n=nums.size(); if(n<2||k<=0) return; k=k%n; reverse(nums.begin(),nums.end()); reverse(nums.begin(),nums.begin()+k); reverse(nums.begin()+k,nums.end()); } };reverse:翻转元素顺序
作用:将vector中元素的顺序完全颠倒。
#include <vector> #include <algorithm> // reverse 在这里 std::vector<int> v = {1, 2, 3, 4, 5}; std::reverse(v.begin(), v.end()); // v 变为 {5, 4, 3, 2, 1}推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接
