LeetCode:逆转数组
探索初级算法
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] 说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的 原地 算法。
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
void rd(int* nums,int start,int end){
while(start<end){
int temp;
temp = nums[end];
nums[end--] = nums[start];
nums[start++] = temp;
}
} //反转数组算法
void rotate(int* nums, int numsSize, int k){
if(numsSize<k){
k = k % numsSize;
rd(nums,0,numsSize-k-1);
rd(nums,numsSize-k,numsSize-1);
rd(nums,0,numsSize-1);
}
else{
rd(nums,0,numsSize-k-1);
rd(nums,numsSize-k,numsSize-1);
rd(nums,0,numsSize-1);
}
//在这个算法中要注意k > numsSize的情况 这种情况下要用if进行讨论
//实际上如果k > numsSize ,可以将k对numsSize取余,结果是一样的
}
反转数组算法占用时间相比传统直接逆转算法少许多,能通过LeetCode的检测
思路较为新奇
**在这个算法中要注意k > numsSize的情况 这种情况下要用if进行讨论
实际上如果k > numsSize ,可以将k对numsSize取余,结果是一样的**
时刻注意内存溢出的问题,一般以numsSize结尾都必须-1 以防止内存溢出
思路即是:先反转前n-k个元素,再反转后k个元素,在全部反转
最后附上执行时间表