第一次写博客,如果写得不好,请多指教。
先看题目:
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
其中:
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 10^5
当然了,凡事都先想想暴力求解,但是这个题目有巧解的,我们知道在线性代数里有一个逆运算:
((B^-1)(A^-1))^-1=AB,也就是说要改变这个数组,我们可以把nums数组分成两段有序数组即可
void change(int *nums,int left,int right){
int tmp;
while(left<=right){
tmp=nums[right];
nums[right]=nums[left];
nums[left]=tmp;
right--;
left++;
}
}
void rotate(int* nums, int numsSize, int k){
while(k>=numsSize){
k-=numsSize;
}
change(nums,0,numsSize-1-k);
change(nums,numsSize-k,numsSize-1);
change(nums,0,numsSize-1);
}
change函数负责将A,B先逆置,然后再整体进行逆置操作即可