首页 > 其他分享 >189. 轮转数组

189. 轮转数组

时间:2022-10-07 11:12:11浏览次数:422  
标签:cnt 轮转 cnt1 nums int prex 数组 189

189. 轮转数组

给你一个数组,将数组中的元素向右轮转 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) 的 原地 算法解决这个问题吗?

 

解析:

设起点为下标位置0,临时变量保存起点的值,每次计算出是哪个位置的值要放到当前位置,然后直接放即可

遍历数组,以每个i为起点进行一次上述操作,那如何记录当前下标已经执行过了呢?

每次执行操作之前,先遍历一遍这个环,如果里面有小于起点的下标,则说明已经当前下标已经操作完了

当然这样为O(n^2),用cnt表示当前总共已经操作了多少个数,每次用cnt1记录当前操作的数量

cnt += cnt1,如果cnt == n,则说明数组完成操作

class Solution {
public:

    bool check(int s, int n, int k)
    {
        int nx = (s + k) % n;
        while(nx > s)
        {
            nx = (nx + k) % n;
        }
        if(nx < s) return 0;
        return 1;
    }


    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        int cnt = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(!check(i, n, k)) continue;
            int cnt1 = 1;
            int orig = nums[i];
            int prex = i - k;
            int lastx = i;
            if(prex < 0) prex += n;
            while(prex != i)
            {
                cnt1++;
                nums[lastx] = nums[prex];
                lastx = prex;
                prex -= k;
                if(prex < 0) prex += n;

            }
            nums[lastx] = orig;
            cnt += cnt1;
            if(cnt == n) break;
        }
    }
};

 

标签:cnt,轮转,cnt1,nums,int,prex,数组,189
From: https://www.cnblogs.com/WTSRUVF/p/16759263.html

相关文章

  • 数组的上半比分操作的优化
    对于一个二维数组进行上半部分操作求和求avg#include<cstdio>#include<iostream>#include<cmath>usingnamespacestd;constintN=1000;doublea[N][N];int......
  • Java Arrays:专为数组而生的工具类
    titleshortTitlecategorytagdescriptionheadJavaArrays:专为数组而生的工具类Arrays工具类Java核心常用工具类Java程序员进阶之路,小白的零......
  • 关于树状数组的一些思考
    在写题时看到大佬们对树状数组的精妙使用,故进一步思考树状数组中的规律和信息:存袁术数据a[], 存树状数组数据f[]1、观察到f[i]一定保存了a[i]的数据2、观察到f......
  • Java稀疏数组
    publicclassArrayDemo8{/***稀疏数组*当一个数组中大多数元素为0或同一个值,可以用稀疏数组来保存这个数组*稀疏数组的处理方式*......
  • js数组去重大全,推荐收藏
    情境:将数组vararr=[1,1,‘true’,‘true’,true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,‘NaN’,0,0,‘a’,‘a’,{},{}];中重复的值......
  • C语言:字符数组相互赋值方法
    #include<stdio.h>#include<string.h>main(){charab[100]="asdfasd",ac[100];printf("%d%d\n",ab,ac);//ac=ab由于ab,ac分别为两个数组的起始地......
  • 波浪数组
    Description若对于除首尾位置之外的元素,每一个位置要么比两侧相邻的数字小,要么比两侧相邻的数字大,则称这样的数组为波浪数组现在有一个长度为\(n\)的数组,你每次操作......
  • numpy - 数组的切片
    导入数组的常用模块importnumpyasnp#创建一个多维数组arr=np.random.randint(0,100,size=(5,5))arr在这里,我们创建了一个五行五列的二维数组array([[1......
  • 数组和广义表
    n维数组和抽象数据类型ADTArray{数据对象:数据关系:基本操作:(1)InitArray(&A,n,bound1,。。。。,bound2)(2)Destroy(&A)(3)Value(A,&e,index1,。。。,indexn)取值(4)Assign(A,&e,index1,。。。......
  • 如何将一个 JavaScript 数组打乱顺序
    当我们想将现有的数组打乱顺序,有两个方法:1.Array.prototype.sort()数组的sort()方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串......