把数组做给定次数的rotate操作。
rotate一次:即把末尾的元素放到开头,将其他的元素循环右移一个单位。
【思路】
1.再开个空间,将末尾的k个元素按从前到后的顺序放在新数组的开头,再将原数组剩下的元素按从前到后的顺序赋给新数组剩下的空间。
节省了时间复杂度,增加了空间复杂度。
2.顺向思维,每次处理一次rotate,将最后的元素冒泡到开头。时间复杂度太高。
3.用交换代替rotate,将数组以K分为两半,前半段做翻转,后半段做翻转,最后整体做翻转,时间复杂度和空间复杂度均为最低。
【my code】
void rotate(int nums[], int n, int k) { int k1=k%n; reverse(nums, 0, n-k1-1); reverse(nums, n-k1, n-1); reverse(nums, 0, n-1); } void reverse(int nums[], int l, int h){ //交换代替翻转 int temp; int mid=(l+h)/2; for(int i=l; i<=mid; i++){ temp=nums[i]; nums[i]=nums[h-i+l]; nums[h-i+l]=temp; } }
【后记】
耗时27ms,排名靠前。
所以说,以前学到的算法还是有用的,不经意就会想起来。