这是悦乐书的第184次更新,第186篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第43题(顺位题号是189)。给定一个数组,将数组向右旋转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]

输入:[ - 1,-100,3,99],k = 2

输出:[3,99,-1,-100]

说明:

向右旋转1步:[99,-1,-100,3]

向右旋转2步:[3,99,-1,-100]

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

我们先看下原数组依次旋转7步的结果

[1,2,3,4,5,6,7]

[7,1,2,3,4,5,6]

[6,7,1,2,3,4,5]

[5,6,7,1,2,3,4]

[4,5,6,7,1,2,3]

[3,4,5,6,7,1,2]

[2,3,4,5,6,7,1]

[1,2,3,4,5,6,7]

我们可以发现旋转是有周期性的,周期是数组的长度,所以数组反转的次数是可控制的,只需旋转k对数组长度取余数次即可。

最直接的办法就是使用两层循环,外层控制旋转次数,内层控制元素交换位置。

public void rotate(int[] nums, int k) {
if (k % nums.length != 0) {
int pre, tem;
for (int i=0; i < k % nums.length; i++) {
pre = nums[nums.length-1];
for (int j=0; j<nums.length; j++) {
tem = nums[j];
nums[j] = pre;
pre = tem;
}
}
}
}

此解法时间复杂度为O(n*k),空间复杂度为O(1)。

03 第二种解法

新建一个大小和nums一样的数组,然后将旋转后的元素放入新的数组中,再遍历新数组赋值给nums。新数组的元素从nums的长度先减去k再加上i开始,直到i不小于k为止,这些元素是需要拿到数组前面去的。当i大于等于k时,新数组的元素要从nums的第1位开始,也就是将原数组前面的元素放到后面来。

对于k的值,先判断对数组长度取余是否等于0,不等于0后才会开始下一步操作。

public void rotate2(int[] nums, int k) {
if (k % nums.length != 0) {
k = k % nums.length;
int pointer = 0;
int[] tem = new int[nums.length];
for (int i=0; i < tem.length; i++) {
if (i<k) {
tem[i] = nums[tem.length-k+i];
} else {
tem[i] = nums[pointer++];
}
}
for (int j=0; j<nums.length; j++) {
nums[j] = tem[j];
}
}
}

此解法的时间复杂度是O(n),空间复杂度是O(n),因为使用了新的数组。

04 第三种解法

先通过一个小例子来说明:

nums = {1,2,3,4,5,6,7},k = 3,

先反转其全部元素,变成{7,6,5,4,3,2,1}

再反转前3个元素,变成{5,6,7,4,3,2,1}

再反转后4个元素,变成{5,6,7,1,2,3,4}

这样就能够得到答案了。

public void rotate3(int[] nums, int k) {
if (k % nums.length != 0) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
} public 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(1)。

05 小结

算法专题目前已连续日更超过一个月,算法题文章43+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Rotate Array(Java实现)的更多相关文章

  1. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  2. LeetCode算法题-Non-decreasing Array(Java实现)

    这是悦乐书的第283次更新,第300篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665).给定一个包含n个整数的数组,您的任务是通过修改最多1个元 ...

  3. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  4. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  5. LeetCode算法题-Degree of an Array(Java实现)

    这是悦乐书的第294次更新,第312篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697).给定一个由正整数组成的非空数组,该数组的度数被定义为任意 ...

  6. LeetCode算法题-Array Partition I(Java实现)

    这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...

  7. LeetCode算法题-K-diff Pairs in an Array(Java实现)

    这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...

  8. LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)

    这是悦乐书的第233次更新,第246篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453).给定大小为n的非空整数数组,找到使所有数组元素相等所需的 ...

  9. LeetCode算法题-Find All Numbers Disappeared in an Array(Java实现)

    这是悦乐书的第232次更新,第245篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第99题(顺位题号是448).给定一个整数数组,其中1≤a[i]≤n(n =数组的大小) ...

随机推荐

  1. iOS SQLite详解

    这周比较忙,前几天都加班到11点左右,基本都是到家都是12点左右(稍稍的抱怨一下,免费加班,何为免费,就是任何补偿都没有,例如调休,加班薪,餐补等各项福利,是一点都没有呀)因为App要上线了!App上 ...

  2. YTKNetwork网络封装

    本篇是答应在端午写iOS网络-四篇源码解析以及封装的最后一篇,是针对上一篇YTKNetwork源码解析后的一次封装,也是自己实际项目中所使用过的.在对YTKNetwork封装的时候,还是需要对YTKN ...

  3. [转]windows 10 搭建angular开发环境

    本文转自:https://www.cnblogs.com/lilunpai/articles/7992538.html 一.环境介绍 1.开发环境:Windows10 2.开发ide工具:VS cod ...

  4. 【转】10 个很有用的 jQuery 弹出层提示插件

    模态对话框为网站用户提供了快速显示信息的方法,也可以用来提示错误.警告和确认等信息,这里介绍了 10 个弹出模态对话框插件. How to Create a jQuery Confirm Dialog ...

  5. json接口返回值

    SpringBoot响应客户端渲染数据 1.SpringBoot构造并且返回一个json对象 首先,我们在父包下新建一个pojo的包,并新建一个User类  IDEA自动生成对应的get/set,然后 ...

  6. mapper代理方式开发

    使用mapper代理方式开发: 需要编写mapper接口,UserMapper.java需要编写映射文件,UserMapper.xml需要遵循一些开发规范,mybatis便可以自动生成mapper接口 ...

  7. 2018-11-13 中文代码示例之Programming in Scala学习笔记第二三章

    由于拷贝后文档格式有变, 仅摘几段如下. 完整而且代码带语法高亮的源版在: program-in-chinese/Programming_in_Scala_study_notes_zh 前言: 本书已 ...

  8. 理解PeopleSoft集成代理(Integration Broker)-第1部分

    PeopleSoft 集成代理对于那些刚开始开发PeopleSoft的工程师来说是模糊的,因此,本文的目的是帮助哪些想要了解Peoplesoft集成代理的人. 介绍PeopleSoft集成代理 peo ...

  9. linux 安装 redsi

    下载.解压.编译 wget http://download.redis.io/releases/redis-4.0.10.tar.gz tar xzf redis-4.0.10.tar.gz cd r ...

  10. JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar

    JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar   by:授客 QQ:1033553122 1. 测试环境 apache-jmeter ...