04 2022 档案
摘要:对于单链表而言,链表的反转需要把节点原本指向下一个节点的指向上一个节点,但是: 对于任意一个节点而言,它只知道自己的下一个节点而不知道上一个节点 意味着我们需要知道当前节点的上一个节点是谁? 递归:不考虑操作当前节点,操作当前节点的下一个节点,下一个节点上一个节点很明确,就是当前节点 迭代:用pre
阅读全文
摘要:第一种思路是用栈 遍历链表,将每一个节点值压入栈中 弹栈,逆向输出整个链表 class Solution { public: vector<int> reversePrint(ListNode* head) { vector<int> result; // 将链表的每一个节点值都压入栈中 stack
阅读全文
摘要:关于C++中的数组名是似乎一直没搞懂、但也没花时间研究的问题,今天被同学问道(虽然不是直接遇到),又想起了这个悬而未决的疙瘩,于是决定花时间复习下 数组名和指针的关系 在我学习C++的教材(谭浩强)中我一直记得是“数组名就是指针” 但后面的实践中我发现可能不是这么简单 比如:定义一个静态数组,但后s
阅读全文
摘要:承接做过的上一题——合并两个有序数组的思路,代码思路大概分本两步: 对两个数组按位相加 对每一位上大于10的数字进位操作 代码如下: class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { if(l
阅读全文
摘要:编码思路 首先是递归排序过程 比较两个链表的头节点大小,将更小的节点作为结果链表的头节点,并将这个节点从原链表中删除 递归地重复上述过程,直到两个链表都为空 要注意的情况是 当两个链表中某一个/全都为空 某一个链表的节点被一个个取出后变成了空链表 好像还没用过STL-list,简单去学习下 STL-
阅读全文
摘要:好吧,看到题目的第一反应是:定义一个成员变量用来保存最小值,每次压栈都通过比较刷新这个变量。 那么问题来了:如果最小值被弹出去了怎么办?那么此时单独一个变量可能已经不能满足需求了 说是拿一个辅助栈来存每一步的最小值,不管是插入弹出始终保持同步 嗯,这个“最小栈”拿什么来实现?我还想着会不会是数组什么
阅读全文
摘要:我们知道,栈是“先进后出”而队列是“先进先出”,那么要用两个栈来实现队列想必就是通过对栈中元素进行倒腾来实现 思路 假设两个栈:stack1和stack2 入队元素压入stack1 出队操作: 若stack2为空,则弹出stack1中的所有元素并压入stack2中,这样第一个弹出的便是最先进入栈中的
阅读全文
摘要:刚开始刷力扣的时候注意到一个不太一样的点。 以前写for循环都是for(xxx;xxx;i++)一路这么写过来,教材上面、老师讲课也一路是这么过来的。 但不太一样的是:发现力扣上的for循环都是这么写的for(xxx;xxx;++i),第三个语句都是i而不是i,而且并不只有for下、循环,题解中涉及
阅读全文
摘要:正经的贪心不好找哇,感觉一不留神就变成了动态规划。就连最经典的“找硬币”其实完全使用动态规划也不太对。 本体的关键在于一个**“最大可到达长度”** 思路: // 1. 根据当前位置更新初始的最大可到达长度 // 2. 移动到下一个位置,判断是否可达(值是否小于等于最大可达长度) // 3. 更新最
阅读全文
摘要:本来今天是想学习“贪心算法”,打算找两个题来边学边做。 然后精挑细选选了这题,本来冲着“贪婪”去,瞟一眼题就打算去看题解,然后题解说:最优解是双指针。 啊双指针我会啊,我真蠢😂居然没看出来。然后就写,感觉多简单的 class Solution { public: int maxArea(vecto
阅读全文
摘要:144-二叉树的前序遍历 前序遍历定义:按照D->L->R的顺序访问节点 先访问根节点D 按照先序次序遍历D的左子树 按照先序次序访问D的右子树 class Solution { public: void preorder(TreeNode *root,vector<int> &res){ // 专
阅读全文
摘要:快排 快排是对冒泡的改进,采用分治策略 时间复杂度O(n log n),最好情况O(n log n),最坏情况退化为O(n^2^),空间复杂度O(log n) 基本步骤是: 从待排序列中选定一个“基准” 对序列进行“划分”,比“基准”大的元素放到其右边,比“基准”小的元素放到其左边 对“基准”左右两
阅读全文