⭐算法入门⭐《同余》中等01 —— 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


  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值