博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
189. Rotate Array
阅读量:6642 次
发布时间:2019-06-25

本文共 2761 字,大约阅读时间需要 9 分钟。

题目:

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:

Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

Related problem: 

Credits:

Special thanks to  for adding this problem and creating all test cases.

 

Hide Tags
 
 

链接:  

题解:

数组移动问题。可以参考<编程珠玑>里利用三次reverse达成数组向左移动的方法。向右移动k step相当于向左移动数组长度nums.length - k。 要注意提前取摸,使k成为一个合理的值。

Time Complexity - O(n), Space Complexity - O(1)。

public class Solution {    public void rotate(int[] nums, int k) {        k %= nums.length;        k = nums.length - k;        reverse(nums, 0, k - 1);        reverse(nums, k, nums.length - 1);        reverse(nums, 0, nums.length - 1);    }        private void swap(int[] nums, int l, int r){        int temp = nums[l];        nums[l] = nums[r];        nums[r] = temp;    }        private void reverse(int[] nums, int l, int r){        while(l <= r)            swap(nums, l ++, r --);    }}

 

Update:

依然是三步反转法,先反转整个数组,再翻转0 ~ k - 1, 最后翻转 k ~ n - 1

public class Solution {    public void rotate(int[] nums, int k) {        if(nums == null || nums.length == 0)            return;        int n = nums.length;        k %= n;                reverse(nums, 0, n - 1);        reverse(nums, 0, k - 1);        reverse(nums, k, n - 1);    }        private void reverse(int[] nums, int lo, int hi) {        while(lo < hi)            swap(nums, lo++, hi--);    }        private void swap(int[] nums, int lo, int hi) {        int tmp = nums[lo];        nums[lo] = nums[hi];        nums[hi] = tmp;    }}

 

二刷: 

三步反转法.

Java:

Time Complexity - O(n), Space Complexity - O(1)。

public class Solution {    public void rotate(int[] nums, int k) {        if (nums == null || nums.length == 0 || k == 0) {            return;        }               int len = nums.length;        k %= len;        reverse(nums, 0, len - 1);        reverse(nums, 0, k - 1);        reverse(nums, k, len - 1);    }        private void swap(int[] nums, int i, int j) {        int tmp = nums[i];        nums[i] = nums[j];        nums[j] = tmp;    }         private void reverse(int[] nums, int i, int j) {        while (i < j) {            swap(nums, i++, j--);        }    }}

 

三刷:

Java:

public class Solution {    public void rotate(int[] nums, int k) {        if (nums == null || nums.length == 0 || k <= 0) return;        int len = nums.length;        k %= len;        reverse(nums, 0, len - 1);        reverse(nums, 0, k - 1);        reverse(nums, k, len - 1);    }        private void reverse(int[] nums, int i, int j) {        while (i < j) {            int tmp = nums[i];            nums[i] = nums[j];            nums[j] = tmp;            i++;            j--;        }    }}

 

 

Reference:

转载地址:http://sjovo.baihongyu.com/

你可能感兴趣的文章
我的Logo设计简史
查看>>
Linux系统服务器 GNU Bash 环境变量远程命令执行漏洞修复命令
查看>>
iphone-common-codes-ccteam源代码 CCAutoDisappearView.h
查看>>
Python字符串格式化
查看>>
map的用法
查看>>
安卓 WebView加载本地图片时居中显示
查看>>
UITableView 优化总结
查看>>
信号量同步线程
查看>>
NUC1333 Knight Moves【DFS】
查看>>
B00014 C++实现的AC自动机
查看>>
687C: The values you can make
查看>>
HDU2502 月之数(解法三)
查看>>
设计模式-命令模式
查看>>
C#的几个基本概念
查看>>
JavaScript对象的几种创建方式
查看>>
Linux进程间通信——使用信号量
查看>>
xpath提取多个html标签text
查看>>
android中webservce获取soapObject数据的解析问题
查看>>
[120_移动开发Android]004_android开发之单元测试
查看>>
Java加密算法(二)——对称加密算法DES&AES
查看>>