2020.04.10笔记
leetcode4 NO.189 旋转数组
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 自己解答:两个数组进行转换,后存回原来的数组,时间复杂度n,空间复杂度n
class Solution {
public void rotate ( int [ ] nums, int k) {
int [ ] arrs = new int [ nums. length] ;
for ( int i= 0 ; i< nums. length; i++ ) {
arrs[ ( i+ k) % nums. length] = nums[ i] ;
}
for ( int i= 0 ; i< nums. length; i++ ) {
nums[ i] = arrs[ i] ;
}
}
}
优化解答:跟抢位子一样,去自己该做的位置同时遍历数组
class Solution {
public void rotate ( int [ ] nums, int k) {
k= k % nums. length;
int count = 0 ;
for ( int start= 0 ; start< nums. length; start++ ) {
int current = start;
int previous = nums[ start] ;
do {
int next = ( current + k) % nums. length;
int temp = nums[ next] ;
nums[ next] = previous;
previous = temp;
current = next;
count++ ;
} while ( start != current) ;
if ( count >= nums. length) {
break ;
}
}
}
}
个人最优解答:反转数组 然后再反转前k位,再反转后n-k位,简单粗暴,需要数学好(不是)
public class Solution {
public void rotate ( int [ ] nums, int k) {
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-- ;
}
}
}