时间跨度:5.16-->5.23(从五月的第二个周五到第三个周五)
这段时间内,主要学习的是C++(1篇),力扣刷题(6篇)
C++学习:构造函数和析构函数
构造函数:在创建新对象时给予一些"基础补助",比如二叉树节点,需要让新加入的节点指向谁
析构函数:在对象被销毁时进行的函数操作,就比如说因为主程序要结束了,然后对象将被销毁,这个时候析构函数就会闪亮登场,完成对象的最后一次演出
构造函数在创建对象时可以进行调用,因此构造函数可以进行重构,构造函数也可以通过对参数的控制,分为有参构造和无参构造,而析构函数不可以这样使用
拷贝构造函数:注意拷贝构造函数的参数调用需要加上const和&,因为不能将被拷贝者发生变化
拷贝构造函数通过别的对象进行复制粘贴到自己对象中,这个过程需要将对象作为参数进行传入
构造函数调用方式:括号法
在建立新的对象时,直接在新对象后面加上括号,然后传入参数即可
无参构造函数不可以加上括号,否则将视为函数声明
匿名对象语法:类名(直接传参) (需要单独写出)
匿名对象在当前行执行结束之后立刻析构
力扣每日打卡(新算法:荷兰国旗)
思路:利用双指针,分别指向初始位置和末尾位置,然后遍历数组,如果遍历到了0,就让左指针上的值与0进行交换,左指针右移,如果遍历到了2,就让右指针上的值与2进行交换,右指针左移
int left=0,right=nums.size()-1;
int cur=0;
while(left<=right)
{
if(nums[cur]==0)
{
swap(nums[cur],nums[left++]);
cur++;
}
else if(nums[cur]==2)
{
swap(nums[cur],nums[right--]);
}
else cur++;
}
思考:这里的cur为什么在nums[cur]==0需要自增而在等于2时不需要自增
当与高位进行交换之后,交换过来的数字未知,如果换回来的是个0,那就会出错,
但是与低位进行交换时,我们认为如果换过来一个2,那应该也会出错,但这种设想的前提是2在0的前面,而我们是从前往后遍历的,前面一旦出现了2就已经被我们交换了,如果出现1,那么交换过来之后也是需要向后进行一位递增的,所以这里就直接进行递增即可
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = 0, p1 = 0;
for (int i = 0; i < nums.size(); i++) {
int x = nums[i];
nums[i] = 2;
if (x <= 1) {
nums[p1++] = 1;
}
if (x == 0) {
nums[p0++] = 0;
}
}
}
};
灵神代码采用了连续覆盖的方法进行操作,一步步进行覆盖分析:
如果将循环内的两个判断取出,那么得到的数组应该全部是2,
如果取出第二个循环,那么得到的数组应该是1和2的数字集,由于循环条件是x<=1,数字为0和1的下标都改为1,这个数目一定大于等于0的数目,
最后使用0进行覆盖,将原本属于0的位置用0占据
力扣刷题打卡
关键字:连续子数组,长度最小
使用滑动窗口进行求解:
在滑动窗口中需要关心窗口形成的临时条件,在这个条件内和条件外构成窗口都是解题的关键,这题的关键点是:满足总和大于等于target
也就是当我们的临时变量到达条件时,就需要缩小窗口大小,并且每轮进行比较,查看最小长度,因此,比较操作是在内部的while循环内进行,每次比较更新最小值即可
唯一要注意的一个点就是如果所有元素总和都小于target就需要直接退出,再比较也没有什么意义
力扣每日一题打卡
对三角形类型进行比较
思路一:
根据三角形的边长长度进行比较,如果三条边都不相等,如果三角形恰好有两条边相等,如果三角形所有边都相等,这3种情况进行比较
所以采用哈希表进行操作:
如果哈希表的大小为3,那么3边都不相等,
如果哈希表的大小为2,那么等腰,
如果哈希表的大小为1,那么等边。
思路二:
对三边进行排序,对最短边和最长边进行比较,
如果最短边和最长边相等,那么是等边;
如果中间边和最长边相等,那么是等腰;
如果三边不相等,那么就是普通三角形;
学习打卡之二分查找:
二分法常见情景:排序数组,查找元素,O(logn)的时间复杂度
优点:逻辑简单,实现容易,查找效率很高
缺点:边界条件错了就全错,不变量的关键
二分查找适用于寻找有序数组中的值,不仅仅是特定值,还可以是某个处于边界条件的值,
mid=(right-left)/2+left;
if(nums[mid]>target) right=mid-1; 找得太过偏右
else if(nums[mid]<target) left=mid+1; 找得太过偏左
注意二分查找中有一个重要概念:不变量,就是在循环中始终被维护的量,这常常被当作while循环的循环条件
二分查找中的左闭右闭,左闭右开,等等,只是逻辑表达上有所不同,但是答案得出都是一样的
学习打卡之滑动窗口
滑动窗口常见情景:连续子区间,最长,最短
类型:定长滑动窗口,不定长滑动窗口,求子数组数目
不定长滑动窗口包括越长越合法,越短与合法
定长滑动窗口通常会指定某个特定长度的区间能满足题干中的需求,这个特定长度区间就是一个定长滑动窗口
特点
1,具有一定长度k
2,通常枚举右指针,因为通过右指针可以确定左指针的位置,已知右指针为下标为i,然后区间长度为k,那么左指针位于i-k+1位置,
3,套路:进入窗口,更新答案,退出窗口
不定长滑动窗口
越短越合法
思路:首先要确定a,b,c都要出现过一次,可以使用哈希表或者变量进行存储
求一个子字符串,考虑使用滑动窗口,不断枚举右指针,直到发现a,b,c都出现过一遍,那么就移动左指针进行操作,直到a,b,c其中一种元素小于1,那么停止移动左指针,此时,我们知道现在的[left,right]是不满足条件的,但是[left-1,right]开始满足条件,同理[left-2,right]等等,直到[start,right]都满足条件,合法的连续子数组数目为left个,每轮循环就要使ans+=left,直到循环结束
越长越合法与上面同理,不过ans+=right-left+1