给定一个数组,将数组中的元素向右移动 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);}
}

算法--------旋转数组相关推荐

  1. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  2. 程序员面试题精选100题(42)-旋转数组的最小元素[算法]

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的 ...

  3. 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)

    1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...

  4. Python3实现旋转数组的3种算法

    下面是Python3实现的旋转数组的3种算法. 一.题目 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 例如: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: ...

  5. 数据结构与算法--查找与排序另类用法-旋转数组中的最小数字

    查找与排序 查找 查找与排序都在程序设计中常被用到的算法.查找相对而言简单,一般都是顺序查找,二分查找,哈希表查找,和二叉排序树查找.其中二分查找是我必须熟悉的一种. 哈希表和二叉排序树主要点在于他的 ...

  6. leetcode初级算法2.旋转数组

    leecode初级算法2.旋转数组 仅为个人刷题记录,不提供解题思路 题解与收获 我自己的解法: public static void rotate(int[] nums, int k) {int m ...

  7. 算法题解:旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 解题思路 将旋转数组对半分可以得到一个包含最小元素的新旋转数组 ...

  8. (旋转数组的)二分查找算法

    二分查找算法(Binary Search)是一种高效的.应用广泛的查找算法.它是一种采用分治策略的算法. 基本二分查找算法 二分查找是针对顺序存储的有序序列的:二分查找的基本思想是:将目标元素与序列中 ...

  9. 【算法编程】旋转数组查找最小数字

    题目来源:牛客网 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2, ...

最新文章

  1. 2022-2028年中国麻纺织业投资分析及前景预测报告
  2. MonitorService-监控服务类2
  3. 【ZooKeeper Notes 28】ZooKeeper典型应用场景一览
  4. python join()函数
  5. String() 函数把对象的值转换为字符串。
  6. Mybatis核心配置文件xml详解
  7. vim配置运行python3快捷键_Vim的Dokuwiki快捷键配置
  8. 线性表:2.线性表的顺序存储结构--顺序表及C语言实现
  9. 计算机四级题库百度云,四级题库免费
  10. X264码率控制总结——ABR,CQP,CRF
  11. Linux下如何进入Redis客户端
  12. 基于MSCNN的人群密度估计之数据集制作
  13. 文件服务器 配额,文件服务器配额邮件通知
  14. bootStrap输入框鼠标指针样式设定
  15. Apple 投诉网站
  16. python作为最热门的编程语言你知道多少?
  17. 魅蓝5s的android系统版本,魅蓝5s(全网通)
  18. 微信发送验证码进行验证
  19. 计算机考证有机构培训吗
  20. python学习第二天

热门文章

  1. C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new
  2. im即时通讯源码_IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
  3. CF650C Table Compression
  4. 传统IT和新IT并行推进 EMC两条腿走路助力企业数字化转型
  5. Macbook pro安装MacOS系统
  6. 基于NPOI的Excel数据导入
  7. 使用jsonpath解析json内容
  8. easyUI droppable组件使用
  9. LaTeX 简介与安装
  10. #技术分享# “乐高”内核的诞生