LeetCode 189. 轮转数组(C语言详解|三种解法 + 图解)
一、题目描述给定一个整数数组nums将数组中的元素向右轮转k个位置。示例示例 1输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4]过程右移1次: [7,1,2,3,4,5,6] 右移2次: [6,7,1,2,3,4,5] 右移3次: [5,6,7,1,2,3,4]示例 2输入: nums [-1,-100,3,99], k 2 输出: [3,99,-1,-100]二、解题思路常见有三种解法1️⃣ 使用额外数组2️⃣ 环状替换Cycle Replacement3️⃣ 数组翻转最经典三、解法一额外数组思路将元素直接放到旋转后的正确位置元素nums[i]的新位置是(i k) % n示例nums [1,2,3,4,5,6,7] k 3 n 7位置变化0 → 3 1 → 4 2 → 5 3 → 6 4 → 0 5 → 1 6 → 2C语言代码void rotate(int* nums, int numsSize, int k) { int* temp (int*)malloc(sizeof(int) * numsSize); k k % numsSize; for(int i 0; i numsSize; i) { temp[(i k) % numsSize] nums[i]; } for(int i 0; i numsSize; i) { nums[i] temp[i]; } free(temp); }复杂度分析时间复杂度O(n) 空间复杂度O(n)缺点需要额外数组。四、解法二环状替换Cycle Replacement思路数组旋转其实会形成若干个循环。例如nums [1,2,3,4,5,6,7] k 3移动路径0 → 3 → 6 → 2 → 5 → 1 → 4 → 0每次把元素放到(current k) % n的位置。需要记录移动次数count直到所有元素移动完成。C语言代码void rotate(int* nums, int numsSize, int k) { k k % numsSize; int count 0; for(int start 0; count numsSize; start) { int current start; int prev nums[start]; do { int next (current k) % numsSize; int temp nums[next]; nums[next] prev; prev temp; current next; count; } while(current ! start); } }复杂度分析时间复杂度O(n) 空间复杂度O(1)优点不需要额外空间缺点逻辑稍复杂五、解法三数组翻转最经典这是面试最推荐的方法⭐⭐⭐⭐核心思想通过三次翻转实现数组旋转。举例nums [1,2,3,4,5,6,7] k 3第一步整体翻转7 6 5 4 3 2 1第二步翻转前 k 个5 6 7 4 3 2 1第三步翻转后 n-k 个5 6 7 1 2 3 4C语言代码void reverse(int* nums, int left, int right) { while(left right) { int temp nums[left]; nums[left] nums[right]; nums[right] temp; left; right--; } } 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); }复杂度分析时间复杂度O(n) 空间复杂度O(1)优点原地修改实现简单面试最常见六、三种方法总结方法时间复杂度空间复杂度推荐额外数组O(n)O(n)⭐环状替换O(n)O(1)⭐⭐⭐数组翻转O(n)O(1)⭐⭐⭐⭐面试回答顺序建议先说额外数组 再说翻转法最佳 最后补充环状替换✅核心知识点数组旋转模运算(i k) % n双指针翻转环状替换
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2433025.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!