【数组】【数组拷贝】Leetcode 189. 轮转数组
---------------🎈🎈189. 轮转数组 题目链接🎈🎈-------------------
System.arraycopy()
c是小写!!!!
arraycopy() 方法
:arraycopy() 方法位于 java.lang.System 类中,其语法形式如下:
System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
其中,
srcArray 表示原数组;
srcIndex 表示原数组中的起始索引;
destArray 表示目标数组;
destIndex 表示目标数组中的起始索引;
length 表示要复制的数组长度。
使用此方法复制数组时,length+srcIndex 必须小于等于 srcArray.length,同时 length+destIndex 必须小于等于 destArray.length
解法1 简简单单分成两段 最后拷贝
时间复杂度O(N)
空间复杂度O(N)
class Solution {
public void rotate(int[] nums, int k) {
k = k%nums.length;// 取余的原因是防止要轮转好几轮儿,取余就只算一轮
int[] result = new int[nums.length];
int j = 0;
for(int i = nums.length-k; i <nums.length; i++){
result[j++] = nums[i];
}
for(int i = 0; i <nums.length-k; i++ ){
result[j++] = nums[i];
}
System.arraycopy(result, 0, nums, 0, nums.length); // 数组拷贝
}
}
解法2 翻转翻转再翻转
1234567 k=3
翻转7654321
翻转5674321
翻转5671234
结果:5671234
时间复杂度O(N)
空间复杂度O(N)
class Solution {
public void rotate(int[] nums, int k) {
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){
nums[start]^= nums[end];
nums[end]^=nums[start];
nums[start]^= nums[end];
start++;
end--;
}
}
}