刷题笔记:力扣第189题-轮转数组

1.本题和力扣第151题-反转字符串中的单词很像,可以将数组轮转之后的最终形态看成左右两个单词,这个单词是通过原数组整体反转后再在单词处局部反转得来的。完整代码如下:

cpp 复制代码
 1. // 交换两个整数的值
 2. void swap(int* a, int* b){
 3.     int tmp = *a;
 4.     *a = *b;
 5.     *b = tmp;
 6. }
 7.  
 8. void rotate(int* nums, int numsSize, int k) {
 9.     // k超过数组长度时取模,消除多余旋转次数
10.     k %= numsSize;
11.     // 第一次反转:整个数组全部反转
12.     for (int i = 0; i < numsSize / 2; i++){
13.         swap(&nums[i], &nums[numsSize - i - 1]);
14.     }
15.  
16.     // 第二次反转:前k个元素反转
17.     for (int i = 0; i < k / 2; i++){
18.         swap(&nums[i], &nums[k - i - 1]);
19.     }
20.     // 第三次反转:剩余numsSize-k个元素反转
21.     for (int i = k; i < (numsSize + k) / 2; i++){
22.         swap(&nums[i], &nums[numsSize - i + k - 1]);
23.     }
24. }

该算法时间复杂度为O(n),空间复杂度为O(1)。

2.本题官方还给出了一种环状替换的方法,十分复杂,自己做的时候也想不到,这里只把代码和解析放出来:

cpp 复制代码
 1. // 欧几里得算法求最大公约数
 2. int gcd(int a, int b) {
 3.     return b ? gcd(b, a % b) : a;
 4. }
 5.  
 6. // 交换两个整型变量的值
 7. void swap(int* a, int* b) {
 8.     int t = *a;
 9.     *a = *b, *b = t;
10. }
11.  
12. void rotate(int* nums, int numsSize, int k) {
13.     // 消除多余旋转次数
14.     k = k % numsSize;
15.     // 需要处理的环的数量为 k 和数组长度的最大公约数
16.     int count = gcd(k, numsSize);
17.     // 遍历每一个环
18.     for (int start = 0; start < count; ++start) {
19.         int current = start;
20.         int prev = nums[start];
21.         do {
22.             // 计算当前位置向右移动k步后的下标
23.             int next = (current + k) % numsSize;
24.             // 将待放置的值交换到next位置
25.             swap(&nums[next], &prev);
26.             current = next;
27.         } while (start != current); // 回到起点,当前环处理完成
28.     }
29. }

该算法时间复杂度为O(n),空间复杂度为O(1)。

相关推荐
CCblandy23 分钟前
向量检索 ANN 参数实测:换一种数据分布,recall 掉了 51 个百分点
人工智能·python·算法·自然语言处理·性能优化
CS创新实验室23 分钟前
一棵树怎么做到“自平衡还不太费力“?——红黑树的旋转与染色
数据结构·算法·红黑树·408·计算机考研
Logic10135 分钟前
C语言/数据结构位运算题解:异或XOR找出被挑选一次的果子编号——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
深圳市快瞳科技有限公司41 分钟前
面向端侧部署的多帧宠物身份识别:完整性评分机制与工程约束
人工智能·算法·计算机视觉·端侧ai·宠物识别·宠物ai·宠物身份识别
知产xiao_xin1 小时前
专利立法及修改
经验分享·笔记·知识产权
qq_284274051 小时前
S7-1200 PLC硬件与启保停实训:CPU选型与DC/DC/DC、循环扫描五阶段、博途组态及电动机启停自锁梯形图(含考点)
笔记·学习·自动化·制造
问心无愧05132 小时前
[GXYCTF2019]Ping Ping Ping
android·笔记
ACP广源盛139246256732 小时前
项目评估记录:4K 远距离视频 Serdes 传输方案调研,GSV5800@ACP参数与工程问题记录
笔记·硬件架构·音视频·视频·国产芯片
悠仁さん2 小时前
非类型模板参数的特化与偏特化
java·数据结构·算法
垆边人似月.2 小时前
最优河堤加固(二分答案 + 前缀和)
算法