2025/5/24复习日之周总结1

时间跨度: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值