LeetCode算法题-Rotate Array(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Rotate String(Java实现)
		
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
 - LeetCode算法题-Non-decreasing Array(Java实现)
		
这是悦乐书的第283次更新,第300篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第151题(顺位题号是665).给定一个包含n个整数的数组,您的任务是通过修改最多1个元 ...
 - LeetCode算法题-Heaters(Java实现)
		
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
 - LeetCode算法题-Sqrt(Java实现)
		
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
 - LeetCode算法题-Degree of an Array(Java实现)
		
这是悦乐书的第294次更新,第312篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697).给定一个由正整数组成的非空数组,该数组的度数被定义为任意 ...
 - LeetCode算法题-Array Partition I(Java实现)
		
这是悦乐书的第262次更新,第275篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第129题(顺位题号是561).给定一个2n个整数的数组,你的任务是将这些整数分组为n对 ...
 - LeetCode算法题-K-diff Pairs in an Array(Java实现)
		
这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...
 - LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)
		
这是悦乐书的第233次更新,第246篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453).给定大小为n的非空整数数组,找到使所有数组元素相等所需的 ...
 - LeetCode算法题-Find All Numbers Disappeared in an Array(Java实现)
		
这是悦乐书的第232次更新,第245篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第99题(顺位题号是448).给定一个整数数组,其中1≤a[i]≤n(n =数组的大小) ...
 
随机推荐
- 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数
			
上章链接: 22.C++- 继承与组合,protected访问级别 继承方式 继承方式位于定义子类的”:”后面,比如: class Line : public Object //继承方式是publi ...
 - mybatis_ The content of element type association must match (constructor,id,result,ass ociation,collection,discriminator)
			
一般遇到这种问题肯定要看一看association中元素编写顺序, <resultMap id="orderRslMap" type="orders"&g ...
 - 4.2 explain 之 select_type
			
一.查询类型,主要用于区别 普通查询.联合查询.子查询等的复杂查询 二.常用常见的类型 1. simple : 简单的select查询,查询中不包含子查询或union 2. primary : 查询中 ...
 - python名片管理
			
python名片管理是我根据视频自己敲敲的代码,后续学习会持续更新 代码 card_main.py import card_tools # 无限循环,由用户决定什么时候退出 while True: # ...
 - vue+vuecli+webapck2项目配置文件详解
			
1.文件结构 ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ...
 - loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
			
题意 链接 Sol 神仙题+神仙做法%%%%%%%% 我再来复述一遍.. 首先按照\(y\)坐标排序,然后维护一个扫描线从低处往高处考虑. 一个连通块的内状态使用两个变量即可维护\(ans\)表示联通 ...
 - SAP WM 有无保存WM Level历史库存的Table?
			
SAP WM 有无保存WM Level历史库存的Table? 前日下班回家的路上,收到一个前客户内部顾问同行发过来的微信,问我在SAP系统里哪个表是用来存储WM Level历史库存的. 这个问题问住了 ...
 - 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 ...
 - Android的ToolBar
			
ToolBar比ActionBar更加可控,自由.因此,Google 逐渐使用ToolBar来代替ActionBar. 使用ToolBar 1.要引入appCompat_v7支持 2.主题设置为NoA ...
 - 对YUV数据进行裁剪
			
项目中用到,用来对YUV数据(图片的yuv或者视频单帧yuv数据)进行裁剪. 格式介绍:http://blog.csdn.net/vblittleboy/article/details/1094514 ...