赞
踩
使用一个额外数组暂存最终答案,最后再赋值给nums
时间复杂度:O(n)
空间复杂度:O(n)
public void rotate(int[] nums, int k) {
int n=nums.length;
int[] res=new int[n];
if(k==0)
return;
for(int i=0;i<n;i++){
res[(i+k)%n]=nums[i];
}
for(int i=0;i<n;i++)
nums[i]=res[i];
}
该方法涉及数学知识,比较复杂,详细过程见官方题解
class Solution { public void rotate(int[] nums, int k) { int n = nums.length; k = k % n; int count = gcd(k, n); for (int start = 0; start < count; ++start) { int current = start; int prev = nums[start]; do { int next = (current + k) % n; int temp = nums[next]; nums[next] = prev; prev = temp; current = next; } while (start != current); } } public int gcd(int x, int y) { return y > 0 ? gcd(y, x % y) : x; } }
先翻转整个数组,然后再分别翻转[0,k%n-1]和[n%k,n-1]两个子数组
时间复杂度:O(n)
空间复杂度:O(1)
public void rotate(int[] nums, int k) { int n=nums.length; //这里数组的长度最大是100000 int index=k%n; if(index==0) return; reverse(nums,0,n-1); reverse(nums,0,index-1); reverse(nums,index,n-1); } public void reverse(int[] nums,int start,int end){ int left=start,right=end; while(left<right){ int t=nums[left]; nums[left]=nums[right]; nums[right]=t; left++; right--; } }
//不知道为什么这样写比上面的快 public void rotate(int[] nums, int k) { int index=k%nums.length; trverse(nums,0,nums.length-1); trverse(nums,0,index-1); trverse(nums,index,nums.length-1); } public void trverse(int[] nums,int start,int end){ int left=start,right=end; while(left<right){ swap(nums,left++,right--); } } public void swap(int[] nums,int i,int j){ if(i==j) return ; int temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; }
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。