算法入门同余(中等 - 第一题)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(n105) 个元素的数组,将数组中的元素向右移动 k ( k ≤ 1 0 5 ) k(k \\le 10^5) k(k105) 个位置。
  样例: 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、原题链接

LeetCode 189. 旋转数组

二、解题报告

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 19

算法入门双指针(中等 - 第一题)LeetCode 3

算法入门广度优先搜索(中等 - 第一题)LeetCode 994

算法入门 05深度优先搜索(中等 - 第一题)LeetCode 695

算法入门归并排序(简单 - 第一题)LeetCode 21

算法入门递推(简单 - 第一题)LeetCode 70