leetcode189.轮转数组
为什么题解那么简洁,我都写不出来☹️,我连正确的解法都写不出来🥹
1.开辟额外数组空间
var rotate = function(nums, k) {
const n = nums.length;
const newArr = new Array(n);
for (let i = 0; i < n; ++i) {
newArr[(i + k) % n] = nums[i];
}
for (let i = 0; i < n; ++i) {
nums[i] = newArr[i];
}
};
2.第二种做法每次小循环其实是
ans=(start+k)%n ans=(ans+k)%n
其中不可能有重复的值且最后一定会回到起始位置
每次回到原始位置时,原始位置的下一个值一定没有被遍历过
一共有多少个循环?gcd(n,k)个 每个循环的起点就是0,1,...,gcd(n,k)-1
//进行了n次交换
var rotate = function(nums,k){
const n=nums.length
for(let start=0,cnt=0;cnt<n;start++){
let cur=start
let tmp=nums[cur]
do{
nxt=nums[(cur+k)%n]
nums[(cur+k)%n]=tmp
tmp=nxt
cur=(cur+k)%n
cnt++
}while(cur!=start)
}
return nums
}
//gcd(n,k)求循环次数
const gcd = (x, y) => y ? gcd(y, x % y) : x;
var rotate = function(nums,k){
let n=nums.length
let count=gcd(k,n)
for(let start=0;start<count;start++){
let cur=start
let tmp=nums[start]
do{
let nxt=nums[(cur+k)%n]
nums[(cur+k)%n]=tmp
cur=(cur+k)%n
tmp=nxt
}while(cur!=start)
}
return nums
}
3.三次reverse
let reverse=function(nums,l,r){
while(l<r){
[nums[l],nums[r]]=[nums[r],nums[l]]//创建新数组[nums[r],nums[l]]然后再分别赋值给nums[l],nums[r]
// let tmp=nums[l]
// nums[l]=nums[r]
// nums[r]=tmp
l++
r--
}
}
var rotate=function(nums,k){
let n=nums.length
k=k%n
reverse(nums,0,n-1)
reverse(nums,0,k-1)
reverse(nums,k,n-1)
}