算法入门同余(中等 - 第一题)LeetCode 189
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门同余(中等 - 第一题)LeetCode 189相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
给定一个 n ( n ≤ 1 0 5 ) n(n \\le 10^5) n(n≤105) 个元素的数组,将数组中的元素向右移动 k ( k ≤ 1 0 5 ) k(k \\le 10^5) k(k≤105) 个位置。
样例: n u m s = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] , k = 3 nums = [1,2,3,4,5,6,7], k = 3 nums=[1,2,3,4,5,6,7],k=3
输出: [ 5 , 6 , 7 , 1 , 2 , 3 , 4 ] [5,6,7,1,2,3,4] [5,6,7,1,2,3,4]
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
}
};
- 要求将数组
vector<int>& nums
原地右移 k k k 个单位。
3、原题链接
二、解题报告
1、思路分析
要求原地旋转,我们不妨拷贝一份数组。就会发现,原数组和旋转后数组的位置差了 k k k 个单位,其实这正是数论中同余的概念。
只不过,这里是下标同余,假设要求的数组为a
,原数组为pre
,则有:a[i] = pre[i - k]
,但是数组下标不能为负数,所以需要对数组长度取模,令数组长度为n
,则有a[i] = pre[(i - k) % n]
;但是在C语言中,负数对正数取模,还是负数,所以需要进行如下处理:a[i] = pre[((i - k) % n + n) % n]
。
- 同余的更多内容,可以参考这篇文章:夜深人静写算法(三)- 初等数论入门。
2、时间复杂度
- 两个循环都是 O ( n ) O(n) O(n) 的,所以总的时间复杂度就是 O ( n ) O(n) O(n)。
3、代码详解
#define F(a,b) for(int i = a; i < b; ++i) // (1)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> tmp;
int n = nums.size();
F(0,n) tmp.push_back(nums[i]); // (2)
F(0,n) nums[i] = tmp[ ((i - k) % n + n) % n ]; // (3)
}
};
- ( 1 ) (1) (1) 用宏定义简化代码;
-
(
2
)
(2)
(2) 引入中介数组
tmp
; - ( 3 ) (3) (3) 利用下标同余实现旋转;
三、本题小知识
一个数 a a a 模 b b b,要让结果为正数,需要做如下处理:
((a % b) + b) % b
;
以上是关于算法入门同余(中等 - 第一题)LeetCode 189的主要内容,如果未能解决你的问题,请参考以下文章
算法入门广度优先搜索(中等 - 第一题)LeetCode 994