题目三:
作者:力扣 (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”);