leecode刷题(3)-- 旋转数组
leecode刷题(3)-- 旋转数组
旋转数组
给定一个数组,将数组中的元素向右移动 K 个位置,其中 K 是非负数。
示例:
输入: [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]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
个人理解:
数组的旋转,即把一个数组最开始的若干个元素搬到数组的末尾。
所以我们按照字面意思,来改变数组下标,每次让最后一位数值和前一位数值交换,然后再将最后一位数值赋值为第一位数值,让数组排序。
举个栗子
每旋转一次的执行过程
1) 先将最后一个保存到临时变量
1 2 3 4 5 6 7 8 [8] --- 临时变量
2)位移
_ 1 2 3 4 5 6 7 [8] --- 临时变量
3)将临时变量放到第一个
8 1 2 3 4 5 6 7
代码如下:
public class Rotate {
public static void rotate(int[] nums, int k) {
if (nums == null || k == 0 || k == nums.length) {
return ;
}
// 空间复杂度为 O(1)
int temp = 0;
while (k > 0) {
// 每次将最后一位和前一位数值交换
temp = nums[nums.length - 1];
for (int i = nums.length -2; i >= 0; i--) {
nums[i+1] = nums[i];
}
//每次将最后一位赋值为第一个
nums[0] = temp;
k--;
}
for (int num : nums) {
System.out.print(num + ",");
}
}
public static void main(String[] args) {
int[] nums = {-1, -100, 3, 99};
int k = 2;
rotate(nums, k);
}
}
这样子虽然简单,但是在 leecode 提交却提示超出时间限制。。。看一下时间复杂度确实也是,我们的时间复杂度达到了 O(kn) 。确实太大了 .....((/- -)/
然后自己去网上搜了一下其他回答,贴个老哥的代码在这里,我看的不是很懂,用到的思想是取余翻转。
class Solution {
public static void rotate(int[] nums, int k) {
if (nums == null || k == 0 || k == nums.length) {
return;
}
k = k % nums.length;
reverse(nums, 0, nums.length - k - 1);
reverse(nums, nums.length - k, nums.length - 1);
reverse(nums, 0, nums.length - 1);
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
这里的时间复杂度为 O(n), 比原来的 O(kn) 好,执行效率高了挺多。
leecode刷题(3)-- 旋转数组的更多相关文章
- leecode刷题(22)-- 反转数组
leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...
- leecode刷题(6)-- 两个数组的交集II
leecode刷题(6)-- 两个数组的交集II 两个数组的交集II 描述: 给定两个数组,编写一个函数来计算它们的交集. 示例: 输入: nums1 = [1,2,2,1], nums2 = [2, ...
- leecode刷题(4)-- 存在重复数组
leecode刷题(4)-- 存在重复数组 存在重复数组 题目描述: 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 ...
- leecode刷题(10)-- 旋转图像
leecode刷题(10)-- 旋转图像 旋转图像 描述: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维 ...
- leecode刷题(19)-- 最长公共前缀
leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- leecode刷题(16)-- 字符串转换整数
leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...
- leecode刷题(12)-- 整数反转
leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...
- leecode刷题(11)-- 反转字符串
leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...
- leecode刷题(8)-- 两数之和
leecode刷题(8)-- 两数之和 两数之和 描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输 ...
随机推荐
- 【树莓派智能门锁】使用脚本控制GPIO来开锁【4】
假定你已经通过此文章或者其他方式完成了树莓派的基本配置 [树莓派]RASPBIAN镜像初始化配置 我们通过VNC View连接到树莓派查看一下~ 1.更新一下基本的设置:更新一下源,把python-d ...
- **python中列表 元组 字典 集合
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...
- Linux系统设置Samba共享笔记
# "不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接" C: 之前曾经与主机成功进行连接,连接断开后未将连接状态清除 $: net use */del /y # &q ...
- springboot整合图像数据库Neo4j
百度百科: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从 ...
- git rm简介
本文翻译整理自:http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-rm.html 在git中我 ...
- struts2中s:iterator的使用(2个list嵌套循环)
<s:iterator value="packagePlateTbls" id="plateTbls"> <tr> <td cla ...
- python动态爬取网页
简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...
- jdk环境变量一键设置 管理員运行
退出360等杀毒软件 本机win10 其他环境自测.参考了网上代码修改. @echo off rem dss color 02 mode con cols=70 lines=30 title JDK ...
- RocketMq2
- sed 之 & 符号
sed 之 & 符号 摘自:https://blog.csdn.net/jasonliujintao/article/details/53509620 & 这个符号,其实很有用,在对相 ...