题目
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100]
超时算法(初始)
循环次数过多,时间复杂度太大O(i*j),思想很简单就是每次循环往后推一个元素,最后一个元素挪到第一个
void rotate(int* nums, int numsSize, int k)
{
int i,j;
for(i=0;i<k;i++)
{
int next=nums[numsSize-1];
for(j=numsSize-1;j>0;j--)
{
nums[j]=nums[j-1];
}
nums[0]=next;
}
}
优化算法
(借鉴leetcode大佬,水印如图所示)可以让整个数组先翻转,再分前后两部分翻转,只需多写两个自定义函数,一个用于交换,一个用于翻转
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void reverse(int *nums,int start,int end)//翻转
{
while(end>start)
{
swap(&nums[start++],&nums[end--]);
}
}
void rotate(int* nums, int numsSize, int k)
{
k=k%numsSize; //十分重要 重中之重!!!!
reverse(nums,0,numsSize-1);
reverse(nums,0,k-1);
reverse(nums,k,numsSize-1);
}