// 第一种 连续翻转三次
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = k%nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+n);
reverse(nums.begin()+n,nums.end());
}
};
``
```cpp
// 第二种 开一个新数组赋值
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> a(n);
for(int i = 0;i<n;i++){
a[(i+k)%n] = nums[i];
}
nums.assign(a.begin(), a.end()); // assgin 函数主要是将一个容器中元素全部复制到另一个容器中
//将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。
}
};
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k % n;
int count = gcd(k, n);
for (int start = 0; start < count; ++start) {
int current = start;
int prev = nums[start];
do {
int next = (current + k) % n;
swap(nums[next], prev);
current = next;
} while (start != current);
}
}
};
// 这个是简单的做法 但是空间复杂度是O(n) 不可以
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
unordered_set<int> hash;
for(auto x : nums) hash.insert(x);
int res = 1;
while(hash.count(res)) res++;
return res;
}
};
// 对的 O(1)的空间
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
if(!n) return 1;// 特判一下,一个没有的时候输出1
for(auto & x : nums) // 从第0个开始所以让每个都减1,但是为了防止越界要特判一下INT_MIN
if(x != INT_MIN) x--;
for(int i = 0;i<n;i++){ // 负数和大于长度的数不用看 并且这个数不在自己该在的位置,并且不是重复的时候就交换
while(nums[i] >= 0 && nums[i] < n && nums[i] != i && nums[i] != nums[nums[i]])
swap(nums[i],nums[nums[i]]);
}
for(int i = 0;i<n;i++) // 挨个判断 return i+1;
if(nums[i] != i)
return i+1;
return n + 1; // 如果前面都对应上的话就输出n+1
}
};