最近看《编程珠玑》,里面提到了一个常见的向量旋转问题,是指将一个数按照某点前后置换,比如【1,2,3,4,5,6,7,8,9,10】按照4旋转后,就变成了【5,6,7,8,9,10,1,2,3,4】。
之前在leetcode上也看到了这个问题,当时觉得很简单,就是把前i个数存起来,然后将后面的数据向前移动,然后在把存起来的前i个数加在后面。
《编程珠玑》上提到了两种算法,非常高效,时间复杂度为O(n),空间复杂度为O(1)。
代码1:
int gcd(int a, int b) {
int c;
while ((c = a%b) != 0) {
a = b;
b = c;
}
return b;
}
void rotate1(int* nums, int size,int rotateLen) {
int times = gcd(rotateLen, size);
for (

本文探讨了《编程珠玑》中提到的向量旋转问题,即如何在O(n)时间和O(1)空间复杂度下实现向量旋转。介绍了两种算法:一是通过保存并替换元素的方式,二是通过两次翻转向量来达到旋转目的。这两种方法都具有高效的性能,且详细解释了它们的工作原理和退出条件。

5026

被折叠的 条评论
为什么被折叠?



