这是悦乐书的第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. 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数

     上章链接: 22.C++- 继承与组合,protected访问级别 继承方式 继承方式位于定义子类的”:”后面,比如: class Line : public Object //继承方式是publi ...

  2. mybatis_ The content of element type association must match (constructor,id,result,ass ociation,collection,discriminator)

    一般遇到这种问题肯定要看一看association中元素编写顺序, <resultMap id="orderRslMap" type="orders"&g ...

  3. 4.2 explain 之 select_type

    一.查询类型,主要用于区别 普通查询.联合查询.子查询等的复杂查询 二.常用常见的类型 1. simple : 简单的select查询,查询中不包含子查询或union 2. primary : 查询中 ...

  4. python名片管理

    python名片管理是我根据视频自己敲敲的代码,后续学习会持续更新 代码 card_main.py import card_tools # 无限循环,由用户决定什么时候退出 while True: # ...

  5. vue+vuecli+webapck2项目配置文件详解

    1.文件结构 ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ...

  6. loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)

    题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...

  7. SAP WM 有无保存WM Level历史库存的Table?

    SAP WM 有无保存WM Level历史库存的Table? 前日下班回家的路上,收到一个前客户内部顾问同行发过来的微信,问我在SAP系统里哪个表是用来存储WM Level历史库存的. 这个问题问住了 ...

  8. Link Between SAP SD, MM & FI

    Link Between SAP SD, MM & FI 1. In SAP you will always get integration with other modules. SD wi ...

  9. Android的ToolBar

    ToolBar比ActionBar更加可控,自由.因此,Google 逐渐使用ToolBar来代替ActionBar. 使用ToolBar 1.要引入appCompat_v7支持 2.主题设置为NoA ...

  10. 对YUV数据进行裁剪

    项目中用到,用来对YUV数据(图片的yuv或者视频单帧yuv数据)进行裁剪. 格式介绍:http://blog.csdn.net/vblittleboy/article/details/1094514 ...