关关的刷题日记12——Leetcode 189. Rotate Array 方法1、2、3
关小刷刷题12 – Leetcode 189. Rotate Array 方法1、2、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.
题目给出数组的长度和旋转次数,要求对整个数组向右进行旋转操作。
方法1
方法1:暴力求解,每次往右移动一步,时间复杂度为O(n2),超时了。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k=k%n;
if(k==0)
return;
for(int i=0; i<k; i++)
{
int temp=nums[n-1];
for(int j=n-1; j>0; j--)
{
nums[j]=nums[j-1];
}
nums[0]=temp;
}
}
};
方法2
方法2:额外开辟个数组,把旋转后得到的结果算出来一次性存到里面,然后再替换原来数组。时间复杂度O(n).
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k=k%n;
if(k==0)
return;
vector<int>temp(n, 0);
for(int i=0; i<n; i++)
{
temp[(i+k)%n]=nums[i];
}
for(int i=0; i<n; i++)
{
nums[i]=temp[i];
}
}
};
方法3
方法3:时间复杂度O(n),还不需要开辟额外空间,不过不容易想到,可以记下来这种方法。三次翻转法,第一次翻转全部,第二次翻转前k个,第三次翻转后n-k个。
class Solution {
public:
void reverse(vector<int>& nums, int start, int end)
{
for(int i=start; i<=(start+end)/2; i++)
{
int temp=nums[i];
nums[i]=nums[start+end-i];
nums[start+end-i]=temp;
}
}
void rotate(vector<int>& nums, int k) {
int n=nums.size(), temp=0;
k=k%n;
if(k==0)
return;
reverse(nums, 0, n-1);
reverse(nums, 0, k-1);
reverse(nums, k, n-1);
}
};
方法4
方法4:师父出手,总能写出简洁优雅的代码。时间复杂度O(n).C++容器的insert()函数有以下三种用法: 最终*it=val;
//用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器, iterator insert( iterator it, const TYPE &val );
//用法2:在指定位置it前“插入”num个值为val的元素 void insert( iterator it, size_type num, const TYPE &val );
//用法3:在指定位置it前“插入”区间[start, end)的所有元素. void insert( iterator it, input_iterator start, input_iterator end );vector中插入一个元素时间复杂度是O(n), 批量插入的话时间复杂度也是O(n).
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k%=n;
nums.insert(nums.begin(), nums.begin()+n-k, nums.end());
nums.resize(n);
}
};
聪明是需要积累的,加油!
以上就是关关关于这道题的总结经验,希望大家能够理解,有什么问题可以在我们的专知公众号平台上交流或者加我们的QQ专知-人工智能交流群 426491390,也可以加入专知——Leetcode刷题交流群(请先加微信小助手weixinhao: Rancho_Fang)。
- PostgreSQL并行查询是个什么“鬼"?
- 想弄一台简单的区块链服务器?来这里看看!!
- NNabla:索尼开源的一款神经网络框架
- 黑客与C语言
- 浅谈分布式事务
- 漫谈千亿级数据优化实践:一次数据优化实录
- Facebook开源游戏平台ELF:一个用于实时战略游戏研究的轻量级平台
- 用不到50行的Python代码构建最小的区块链
- 学习笔记CB002:词干提取、词性标注、中文切词、文档分类
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
- 用Python从零开始构建反向传播算法
- 备战CDA数据分析竞赛!Kaggle赛题大揭秘
- 如何用Python将时间序列转换为监督学习问题
- Spring MVC的配置和使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法