今日总结:
- STL需要加强熟悉使用
- 抓紧时间!规定每天完成当天的任务!
977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
// 双指针,自己写的
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
vector<int> res = {};
int l = 0, r = 0;
while (left <= right) {
l = nums[left] * nums[left];
r = nums[right] * nums[right];
if (l >= r) {
res.insert(res.begin(), l); // 注意这里,第一个参数,注意变量名
++left;
}
else {
res.insert(res.begin(), r);
--right;
}
}
return res;
}
// 方法2:先运算,后排序
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res;
for (int num:nums) {
res.push_back(num*num);
}
sort(res.begin(), res.end());
return res;
}
//还有一种类似于归并排序(也是双指针,从最小的开始指)
189. 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
// 方法1:使用额外数组,创建一个容器来复制最后替换
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> res(n);
for (int i = 0; i < n; i++)
{
res[(i + k) % n] = nums[i];
}
nums.assign(res.begin(), res.end());
}
// 方法2:环状替换
// 方法3:数组翻转
// 这个方法技巧性很强
void reverse(vector<int>& nums, int start, int end) {
while (start<end)
{
swap(nums[start++], nums[end--]);
}
}
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1); // 整体翻转
reverse(nums, 0, k - 1); // 前半部分翻转
reverse(nums, k, nums.size() - 1); // 后半部分翻转
}