ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

15 轮转数组

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 - 1
  • 0 <= 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等技术内容,点击立即学习:链接

返回列表