【贪玩巴斯】每日一练——《力扣:LeetCode 算法入门》(C++)——「旋转数组」

本文解析LeetCode经典问题——旋转数组,探讨如何使用O(1)空间复杂度的原地算法,通过取余运算和vector向量操作实现数组右移。实例演示及关键代码片段展示了向右旋转数组的两种方法,适合进阶学习者理解数组操作技巧。
摘要由CSDN通过智能技术生成

题目三:

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x248f5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目:旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

示例 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 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

提示:
1 <= nums.length <= 2 * 104
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

相关标签:
数组
数学
双指针

C++源程序

class Solution {
public:
    void rotate(vector<int>& nums, int k) {     
        int length = nums.size();
        vector<int> newArr(length); // 构建一个新数组 这里涉及到vector用法可以看后面的 涉及知识有详细讲解。
        for(int i = 0; i < length; i++){
            newArr[(i+k) % length] = nums[i]; // 这里的意思就是说,当 移动 不超过长度时候,取余结果直接为移动到达的下标位置。如果超过了,可以通过取余得到位移后的下标位置。
    }
     nums.assign(newArr.begin(), newArr.end()); // assign函数
}
};

个人心得:

这道题我做过两次了,其中最关键的地方莫过于(i+k) % length 这个算法点,利用取余来进行得到下标位置。
另一个重要点在于——考虑构建一个新的vector数组。

涉及知识:

1. vector newArr(length)

  • Vector<类型>标识符(最大容量,初始所有值)

以及vector< vector > dp(m, vector(n) )

常见定义方法:

(1) vector a(5);
//定义了5个整型元素的向量(<>中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
(2)vector a(5,1); //定义了5个整型元素的向量,且给出每个元素的初值为1
(3)vector
a(b); //用b向量来创建a向量,整体复制性赋值
(4)vector a(b.begin(),b.begin+3);
//定义了a值为b中第0个到第2个(共3个)元素 (5)int b[7]={1,2,3,4,5,9,8};
vector a(b,b+7); //从数组中获得初值

vector< vector > v(m, vector(n) ); 定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

2. nums.size()

  • 获得数组长度

3. num.assign()函数

  • assign赋值方法,释放了原来的数据空间,并分配了新的数据空间
  • assign操作不适用与关联容器和array;

assign的3种赋值操作;

  • seq.assign(b, e);
  • 将seq中的元素替换为迭代器b和e所表示的范围中的元素,迭代器不能指向seq中的元素;assign操作后可将l1内容赋值给l2;

list<char *> l1 = {“a”, “an”, “the”};
vector l2;
l2.assign(l1.begin(), l1.end()); b和e也可表示子范围的元素

list<char *> l1 = {“a”, “an”, “the”};
vector l2;
l2.assign(l1.begin(), l1.begin()+1);

  • seq.assign(i1);
  • 将seq中元素替换为初始化列表i1中的元素;

string l1 = (“a”, “an”, “the”);
vector l2;
l2.assign(l1);

  • seq.assign(n, t)
  • 将seq中元素替换为n个值为t的元素

vector l2;
l2.assign(10,“hi”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贪玩巴斯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值