问题描述

给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。

解题思路1:暴力破解法

最简单的方法是旋转 k 次,每次将数组旋转 1 个元素。

代码实现1:

class Solution {public void rotate(int[] nums, int k) {int temp, previous;for (int i = 0; i < k; i++) {previous = nums[nums.length - 1];for (int j = 0; j < nums.length; j++) {temp = nums[j];nums[j] = previous;previous = temp;}}}}

解题思路2:反转数组

这个方法基于这个事实:当我们旋转数组 k 次, k%n 个尾部元素会被移动到头部,剩下的元素会被向后移动。

在这个方法中,我们首先将所有元素反转。然后反转前 k 个元素,再反转后面 n−k 个元素,就能得到想要的结果。
假设 n=7 且 k=3 。

原始数组                  : 1 2 3 4 5 6 7
反转所有数字后             : 7 6 5 4 3 2 1
反转前 k 个数字后          : 5 6 7 4 3 2 1
反转后 n-k 个数字后        : 5 6 7 1 2 3 4 --> 结果

代码实现2

class Solution {public void rotate(int[] nums, int k) {if(nums.length==1 || k==0){return;}k=k%nums.length;reverse(nums,0,nums.length);reverse(nums,0,k);reverse(nums,k,nums.length);for(int i=0;i<nums.length;i++){System.out.println(nums[i]);}}public void reverse(int[] nums,int start,int end){if(end-start<=1){return ;}int mid=(end-start)/2+start;for(int i=start;i<mid;i++){int temp=nums[i];nums[i]=nums[end+start-i-1];nums[end+start-i-1]=temp;}}
}

leetcode题解189-旋转数组相关推荐

  1. 数组元素替换_LeetCode 题解 | 189. 旋转数组

    力扣 189. 旋转数组(点击查看题目) 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 示例 2: 说明: 尽可能想出更多的解决方案,至少有三种不同的方 ...

  2. LeetCode-数组-189. 旋转数组

    描述 189. 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 O( ...

  3. 189. 旋转数组 golang

    一个引出较多知识点的题 关于golang的append函数的踩坑 剑指offer-翻转字符串 557. 反转字符串中的单词 III 题目 189. 旋转数组 给定一个数组,将数组中的元素向右移动 k ...

  4. 每日一道 LeetCode (42):旋转数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  5. leetcode 11:旋转数组的最小数字

    leetcode 11:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按 ...

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

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

  7. LeetCode 189. 旋转数组(环形替换)

    1. 题目 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向 ...

  8. Leetcode 189. 旋转数组 解题思路及C++实现

    方法一:暴力方法 解题思路: 用栈存储后面的 k 个元素,然后将 nums 数组的元素往后挪 k 位,然后再将栈中的元素存进nums数组中. class Solution { public:void ...

  9. Leetcode 189. 旋转数组 (每日一题 20210909)

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数.进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问 ...

最新文章

  1. LeetCode简单题之拼写单词
  2. PubChem分子库
  3. 网络接口配置-Bonding
  4. 黄聪:【强烈推荐】搜索引擎排名决定一切吗!
  5. Using SharePoint 2003 Web Services to Retrieve Data From A List
  6. 20200218:不同路径(leetcode62)
  7. Python时间序列分析指南!
  8. java计算机毕业设计劳务外包管理系统源码+系统+mysql数据库+lw文档
  9. 常见的思维模型:5W2H和2W1H
  10. FreeMarker模板制作
  11. 计算机如何使用键盘复制粘贴,电脑复制粘贴快捷键,小编教你电脑怎么用键盘复制粘贴...
  12. 报名啦!第四届滴滴-IEEE未来精英论坛今夏来袭
  13. Python爬取网易云音乐热评(附源码)
  14. flowable 排他网关
  15. 川师计算机类专业收分安徽,四川师范大学专业收分
  16. Bone Collector(01背包问题-两种写法)
  17. 闵帆老师《论文写作》心得体会
  18. RK3399实际解码能力测试
  19. 《番茄工作法图解》全书笔记
  20. 全球及中国SaaS(软件运营服务)市场竞争态势预测及未来发展走势分析报告2021-2027年

热门文章

  1. 烦人的恶意骚扰电话终于要被整治了!移动联通齐发声明...
  2. iPhone又降价了!京东、苏宁安排上了 iPhone XS系列最高直降1700元
  3. 春晓html代码,春晓
  4. 线性表:1.什么是线性表
  5. 什么是原子操作?Linux下有哪些原子操作API
  6. 为什么开发人员要使用Linux
  7. cmakefile 基础篇
  8. 投放屏幕upnp协议探究抓包
  9. oracle:中位数查询整理
  10. php+预览和下载pdf文件,vue实现在线预览pdf文件和下载(pdf.js)