总结:共刷两题,采用模式为:先思考试写后看课/看题解,看完题解/课程后再次尝试手动复原。
总计用时:3h20mins
leetcode模板解释:感觉leetcode的代码框架跟自己之前在另一个网站上看到的有区别,本来自己的C++底子有点弱不禁风,但是基础的语法好像也还算熟悉,主打一个学到哪儿不会就补一下。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 实现代码的位置
}
};
该常见代码块代表的意思是:
class为类,Solution是评测系统自动定义的名称,等于是你的解题包裹的名称。
public表示访问权限,允许评测系统访问该实现方法。
vector<int>是整型格式的一种,定义了该函数最终的返回。
括号里的表示传递相关的参数,加上&表明不用复制整个数组,只是单纯的引用。输入就从此读入,评测系统直接通过此处传参,所以用户不需要自行cin再次传入。
977.有序数组的平方
自己想法:最开始能想到的只有暴力解法,而且想不到平方的函数,突然想到直接相乘就可以。脑子也是有点僵化了。
不清晰的点:不清楚哪个函数可以直接调用来排序。--> sort(A.begin(),A.end())//调用sort函数,直接输入头和尾。
sort是C++ STL库中排序用的核心函数,语法如下:(comparator默认按照升序排序)
sort(start_iterator, end_iterator, [comparator]);
sort(nums.begin(), nums.end(), greater<int>());
// 排序后 nums = {5, 4, 3, 1, 1}
正确解法:双指针
认清楚该结果数组的特性:最大值仅可能出现在数组的前后两个末端,即绝对值最大的地方。
即设置i, j两个指针分别指向前端和末端,而设立一个新数组来吸收判断出来的新数组。
注意出错点:
1.对新建立的数组要进行初始化,vector<int> result (元素数量,初始化的值)
如vector<int>(A.size(), 0)就是建立一个大小为A.size()的全是0的数组。
2.设立的末尾是A.size() - 1。
3.前后指针的判断条件是i <= j
4.挪动的时候要在赋完值之后再挪动,而不是写在for循环中挪动。
209.长度最小的子数组
自己想法:想到的就是用一个循环数组直接对现有的数组进行递减的排序,sort()。然后再写一个循环来判断不大于它的那个值要加几次。
不清晰的点:出现了部分样例不通过的现象。对题目的理解有问题。题目提到长度最小的连续的子数组,即在原数组要连续,不能进行排序的处理。
暴力解法是两个for循环硬找,会超时,故不做过多的赘述。
正确的解法:滑动窗口
第一个for循环是指向末尾的,指向前端的指针为辅助。
先通过第一轮的i = 0时的状态找出是否可以得到长度,再在现有长度上后指针保持移动,前指针看情况移动这样的情况。
注意:
1.先检查一下符号是否用对。
2.思考两个指针的话将如何使用。
3.设置完循环后,后端指针的sum的加和不应该添加条件。直接猛猛加就完事儿。
4.学会用判断语句解决问题,(result == INT_MAX) ? 0 : result;