算法--------旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [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:输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的原地算法。
我的解答:
class Solution {public void rotate(int[] nums, int k) {
if (nums == null || nums.length == 0 || k==0) {return;}int temp ,temp2;int length = nums.length;if (k > length) {k = k%length;}k = k%length;if (length == k || k==0) {return;}int count =0;out:for (int i = length - 1; i >= length - 1 - k; i--) {temp = nums[i];for (int j = (i + k) % length; j <= i; j = (j + k) % length) {temp2 = nums[j];nums[j] = temp;temp = temp2;count ++;if (count == length) {break out;}if (j == i) {break;}}}}
}
/*** 大概思路是,从数组的末尾开始,把现在的数据放到每隔K的位置上,* 超过了数组长度,就取余。* 如果执行了一圈,回到了开始替换的位置,那么执行下一圈。*比如:原始数组:[1,2,3,4]第一次把4放到数组第二的位置,并把2缓存起来数组:[1,4,3,4]第二次把数组第四的位置,缓存起来,并把缓存的2放到数组第四的位置,数组:[1,4,3,2]这时候发现又回到了原来的位置,那么本次循环结束,从第三个位置开始,继续循环数组:[3,4,3,2]数组:[3,4,1,2]数组:[3,4,1,2]* 如果执行过程中从来没回到过原来的位置,那么替换N 次以后,就是* 最终的数组,所有的数据都换了一下位置。*比如:* 原始数组:[1,2,3,4,5]* 第一次,把第五的位置数组,放到第二个,因为k是2,并且第二个位置的2 要缓存起来* 数组:[1,5,3,4,5]* 第二次,把第四个位置的4缓存起来,然后把缓存的2放到第四个位置数组:[1,5,3,2,5]第三次,把第一个位置的1缓存起来,然后把缓存的4放到第一个位置数组:[4,5,3,2,5]这种是永远都不会回到之前替换过的位置,替换N次结束即可数组:[4,5,1,2,5]数组:[4,5,1,2,3]数组:[4,5,1,2,3]** 时间复杂度是n*k,网上最快的算是0m,说实话,我有点不服气* 因为他们用了新的数组,开辟了新的内存空间。* 我错了,时间复杂度是O(n) ,不是O(n*K)* 因为当执行了n次之后,双层循环就会结束。** @param nums* @param k*/
网上最快的算法:
但是这种算法,额外开辟了空间。我觉得有违题的意思。
class Solution {public void rotate(int[] nums, int k) {k=k%nums.length;int[] tmp=nums.clone();System.arraycopy(tmp,tmp.length-k,nums,0,k);System.arraycopy(tmp,0,nums,k,tmp.length-k);}
}
算法--------旋转数组相关推荐
- leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现
leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...
- 程序员面试题精选100题(42)-旋转数组的最小元素[算法]
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的 ...
- 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)
1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...
- Python3实现旋转数组的3种算法
下面是Python3实现的旋转数组的3种算法. 一.题目 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 例如: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: ...
- 数据结构与算法--查找与排序另类用法-旋转数组中的最小数字
查找与排序 查找 查找与排序都在程序设计中常被用到的算法.查找相对而言简单,一般都是顺序查找,二分查找,哈希表查找,和二叉排序树查找.其中二分查找是我必须熟悉的一种. 哈希表和二叉排序树主要点在于他的 ...
- leetcode初级算法2.旋转数组
leecode初级算法2.旋转数组 仅为个人刷题记录,不提供解题思路 题解与收获 我自己的解法: public static void rotate(int[] nums, int k) {int m ...
- 算法题解:旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 解题思路 将旋转数组对半分可以得到一个包含最小元素的新旋转数组 ...
- (旋转数组的)二分查找算法
二分查找算法(Binary Search)是一种高效的.应用广泛的查找算法.它是一种采用分治策略的算法. 基本二分查找算法 二分查找是针对顺序存储的有序序列的:二分查找的基本思想是:将目标元素与序列中 ...
- 【算法编程】旋转数组查找最小数字
题目来源:牛客网 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2, ...
最新文章
- 2022-2028年中国麻纺织业投资分析及前景预测报告
- MonitorService-监控服务类2
- 【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
- python join()函数
- String() 函数把对象的值转换为字符串。
- Mybatis核心配置文件xml详解
- vim配置运行python3快捷键_Vim的Dokuwiki快捷键配置
- 线性表:2.线性表的顺序存储结构--顺序表及C语言实现
- 计算机四级题库百度云,四级题库免费
- X264码率控制总结——ABR,CQP,CRF
- Linux下如何进入Redis客户端
- 基于MSCNN的人群密度估计之数据集制作
- 文件服务器 配额,文件服务器配额邮件通知
- bootStrap输入框鼠标指针样式设定
- Apple 投诉网站
- python作为最热门的编程语言你知道多少?
- 魅蓝5s的android系统版本,魅蓝5s(全网通)
- 微信发送验证码进行验证
- 计算机考证有机构培训吗
- python学习第二天
热门文章
- C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new
- im即时通讯源码_IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
- CF650C Table Compression
- 传统IT和新IT并行推进 EMC两条腿走路助力企业数字化转型
- Macbook pro安装MacOS系统
- 基于NPOI的Excel数据导入
- 使用jsonpath解析json内容
- easyUI droppable组件使用
- LaTeX 简介与安装
- #技术分享# “乐高”内核的诞生