15 轮转数组

news/2024/10/22 15:40:16/

轮转数组

    • 题解1 环状替换(学习思想)(空间O(1))
    • 题解2 翻转数组(有意思好理解)(空间O(1))
    • 题解3 空间O(N)秒答

给定一个整数数组 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 <= n u m s . l e n g t h nums.length nums.length <= 1 0 5 10^{5} 105
  • − 2 31 -2^{31} 231 <= nums[i] <= 2 31 2^{31} 231 -1
  • 0 <= k <= 1 0 5 10^{5} 105

进阶:

尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

题解1 环状替换(学习思想)(空间O(1))

class Solution {
public:void rotate(vector<int>& nums, int k) {const int s = nums.size();// 先处理k(减少后面的不必要循环)k = k % s;// cylimit 就是为了保证能把元素全部遍历, 设最小遍历次数为N// N = as = bk (等式基于遍历经过的长度)-> N 应该是s, k的最小公倍数lcm(s, k)// lcm(s, k)/k = b 即遍历N次遍历过的元素总数目// cylimit = s / (1/k * lcm(s, k)) = sk / lcm(s,k) = gcd(s, k) 即s, k最大公倍数  int cylimit = gcd(k, s);for(int c = 0; c < cylimit; c++){// O(1): 把每个能计算到的位置对应的原来的值放在[c]的位置int cur = c;do{// 新下标int newI = (cur+k) % s;// 每次都把改变的值放在[c]上swap(nums[newI], nums[c]);// 循环找下一个cur = newI;}while(cur != c); // %的关键:停止条件是回到起始位置}}
};

在这里插入图片描述

题解2 翻转数组(有意思好理解)(空间O(1))

在这里插入图片描述

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) {const int s = nums.size();// 先处理k(减少后面的不必要循环)k = k % s;reverse(nums, 0, s-1);reverse(nums, 0, k-1);reverse(nums, k, s-1);}
};

在这里插入图片描述

题解3 空间O(N)秒答

class Solution {
public:void rotate(vector<int>& nums, int k) {const int s = nums.size();// 先处理k(减少后面的不必要循环)k = k % s;vector<int> newN(s, 0);for(int i = 0; i < s; i++){newN[(i+k)%s] = nums[i];}nums.assign(newN.begin(), newN.end());}
};

在这里插入图片描述


http://www.ppmy.cn/news/1099085.html

相关文章

Selling a Menagerie(cf)

该题考察了拓扑排序dfs 题意&#xff1a;你是一个动物园的主人&#xff0c;该动物园由编号从1到n的n只动物组成。然而&#xff0c;维护动物园是相当昂贵的&#xff0c;所以你决定卖掉它&#xff01;众所周知&#xff0c;每种动物都害怕另一种动物。更确切地说&#xff0c;动物…

Maven编译java及解决程序包org.apache.logging.log4j不存在问题

1、首先新建一个文件夹&#xff0c;比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

LlamaIndex:将个人数据添加到LLM

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 LlamaIndex是基于大型语言模型&#xff08;LLM&#xff09;的应用程序的数据框架。像 GPT-4 这样的 LLM 是在大量公共数据集上预先训练的&#xff0c;允许开箱即用的令人难以置信的自然语言处理能力。但是&#xff0c;…

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

字符串子序列II

■ 题目描述 【字符串子序列II】 给定字符串 target和 source&#xff0c;判断 target是否为 source 的子序列。你可以认为target和 source 中仅包含英文小写字母。 字符串 source 可能会很长&#xff08;长度~500,000&#xff09;&#xff0c;而 target是个短字符串&#x…

leetcode 97. 交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t t1 t2 … tm |n - m| < 1 交错 是 s1 …

RTPV70-30、RTPV72-30电磁比例插装阀放大器

RTSP08-20、RTSP10-20、RTSP12-20、RTSP08-22、RTHSP09-30、RTPV70-30、RTPV72-30电磁比例插装阀额定电磁线圈适合连续工作&#xff0c;应急手控选件&#xff0c;外置式比例放大器&#xff0c;效湿式衔铁结构&#xff0c;可选IP69K防水E型线圈&#xff0c;工业通用阀孔。

【C/C++】BMP格式32位转24位

问题 如题 解决方法 bmp文件格式参考:【C/C++】BITMAP格式分析_vc++ bitmap头文件_sunriver2000的博客-CSDN博客BITMAP文件大体上分成四个部分,如下表所示。文件部分长度(字节)位图文件头 Bitmap File Header14位图信息数据头 Bitmap Info Header40调色板 Palette4*n (n≥…