- 博客(26)
- 收藏
- 关注
原创 代码随想录算法训练营第九天打卡
栈遵循先进后出原则(FILO)。而队列则是遵循先进先出原则(FIFL)。在C++中,通常用STL标准库中的stack容器实现栈,用queue容器来实现队列。使用两个队列实现栈的功能。
2023-09-15 01:38:08 706
原创 代码随想录算法训练营第六天打卡
本题有两种解法:暴力解法和哈希法。其中,暴力解法则是使用四个for循环,但是这种解法时间复杂度较高,为O(n^4)。哈希法的做法则是先将四个数组进行两两分组,然后的思路和两数之和一样。这道题和异位词的思路一样,都是用数组和哈希法来解决,在这里不多赘述。
2023-09-12 05:16:47 750 1
原创 代码随想录算法训练营第五天打卡
虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,std::set、std::multiset 使用红黑树来索引和存储,不过给我们的使用方式,还是哈希法的使用方式,即key和value。std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。这里数组就没啥可说的了,我们来看一下set。
2023-09-11 04:37:58 752
原创 代码随想录算法训练营第四天打卡
首先,快指针和慢指针都指向dummy虚拟头节点,然后将快指针先移动N+1步,然后快指针和慢指针一起移动,直到快指针指向链表的最后,慢指针就正好指向倒数第N个节点的前面那个节点,就可以方便的将其倒数第N个节点删除。关于第一个问题,可以定义两个指针,一个快指针和一个慢指针。这道题的主要思路是先将两个链表的长度求出,然后让长链表先移动,移动到和短链表长度相同的时候,再将两个链表一起移动,直到移动到两个链表相交。这道题我个人认为有一定难度。其中,有两个难点:1.如何知道链表是否相交 2.如何找到链表相交的入口点。
2023-09-09 04:01:57 766
原创 代码随想录算法训练营第三天打卡
如果不定义虚拟头节点的话,链表的第一个元素就需要单独处理,而如果定义虚拟头节点的话,那么整个链表就可以遵循相同的处理规则。什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。
2023-09-08 05:43:15 34 1
原创 代码随想录算法训练营第二天打卡
方法一:将数组的负数部分先取绝对值,然后排序。这样子平方后的数组也一定是按照升序的顺序来的。但是,这个方法的实现略显复杂,而且时间复杂度较高,这里演示。与此同时,我自己也想出来了一种解法:先将数组整体排序,然后从大到小累加,判断是否存在最小子数组满足条件。这道题需要分四条边依次遍历并赋值,遵循左闭右开的原则,并且需要处理n为奇数的情况。方法二:Carl的方法,使用两个指针分别指向原数组的头和尾,然后将数组的头和尾依次平方并比较。这道题有两种方法,一种是我自己想的,另外一种是从Carl那儿学到的。
2023-09-07 08:45:30 40 1
原创 代码随想录算法训练营第一天打卡
当fast指针遍历到需要删除的元素时,则避开需要删除的元素,遍历下一个元素,直到遍历完整个数组,并将整个数组中不需要移除的值全部通过slow指针赋值给数组。这就导致了一个优点和一个缺点:优点是当我们需要查找数组中的某个元素时,可以直接通过下标访问,因此查找的时间复杂度较低,为O(1)。无论是使用左闭右闭还是使用左闭右开来写,在更新left和right时,都需要遵循左闭右闭/左闭右开的原则,以免出现不必要的错误。因此,本题中最理想的解法则是找到一个时间复杂度为O(n)的算法。
2023-09-06 08:45:31 1634
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人