力扣-14天算法入门
第1天 二分查找
第2天 双指针
第3天 双指针
第4天 双指针
第5天 双指针
第6天 滑动窗口
第7天 广度优先搜索 / 深度优先搜索
第8天 广度优先搜索 / 深度优先搜索
第9天 广度优先搜索 / 深度优先搜索
第10天 递归 / 回溯
第11天 递归 / 回溯
第12天 动态规划
第13天 位运算
第14天 位运算
力扣-第2天 双指针
前言
本系列文章是我的力扣刷题记录,采用c++进行编写
一、977. 有序数组的平方
难度(简单)
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
我这里采用双指针,因为我们可以观察到原数组是有序的,且经过平方后,大的数趋于两端,所有定义两端为两个指针,然后进行平方对比,最后返回大的数为数组末位。
具体代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> res(nums.size(), 0);//生成一个和nums一样大小的数组
for (int i = 0, j = nums.size() - 1; i <= j;) {
// 注意这里要i <= j,因为最后要处理两个元素
if (nums[i] * nums[i] < nums[j] * nums[j]) {
res[k--] = nums[j] * nums[j];
j--;
}
else {
res[k--] = nums[i] * nums[i];
i++;
}
}
return res;
}
};
二、189. 旋转数组
难度(中等)
题目:给定一个数组,将数组中的元素向右移动 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]
具体代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k = k % nums.size();//如3%7=3
reverse(nums.begin(),nums.end());//用reverse()将区间[begin,end)内的元素全部逆序;即7 6 5 4 3 2 1
reverse(nums.begin(),nums.begin()+k);//(7 6 5 )逆置:5 6 7
reverse(nums.begin()+k,nums.end());//(4 3 2 1)逆置:1 2 3 4
}
};
总结
期待大家和我交流,留言或者私信,一起学习,一起进步!