Peinan Weng

永不放弃 直到做对为止

LeetCode - Random and Reservoir Sampling - N/A


LeetCode - 600 MARK


算法题 - 子序列目标和及其拓展

一道基于01背包问题的经典DP题。 dp高效率的本质是memory/记忆化,因此在做dp题目时,我更倾向于找出适用的memory结构,再推导状态转移式(而不是直接找状态转移式)。下面用这题作为例子。 原题如下 给定一个数组nums,若其子数组满足所有元素的和为k,求出可能的子数组总数。(设nums中所有元素和为M) 变形一 给定一个数组nums,判断能否从该数组中不重复地取t个数,...

C++ - new & delete

new/delete/new[]/delete[]行为分析

LeetCode - Binary Search - Implementation - N/A

二分查找是典型的原理简单,但实现很容易出错的例子。这里主要问题在于如何设定边界条件。

C++ - 为什么流运算符必须要friend

学C++也很久了,但是一直不知道为什么运算符重载里唯独«和»两个流运算符需要友元/friend标志。 首先要明确,作为成员函数的操作符重载必定隐含第一个操作数为this指针。 看下面这几行语句 1 2 3 x + 1; cout << x; 有什么区别?假设x都是int型,第一句的操作数依次为x和1,第二句的操作数依次为cout和x。 问题就在这里了为什么都是对in...

C++的万恶之源 - 允许类以值类型出现

最近C++课老本已经吃得差不多了,感觉这个问题一定要写个post。 个人认为C++有一个很大的特点,Java/C#等语言可能学70%语法可以去做开发,而C++可能只需要30%(极端点说,只学C语言那部分语法也不是不能用,C++的关键词个数是C语言的两倍多)。 这是因为C++有很多的冗余语法,其中引用/右值引用/移动构造就是一个,还有各种花里胡哨的初始化方法(大括号/小括号),实际上完全可...

C++ 优先队列的陷阱

C++优先队列的元素不适用直接修改来达到重新排列的目的,必须要先pop再push来实现。 (目测应该是仅在pop和push函数调用时会调用heap重排)

LeetCode - Search - Preprocessing and Pruning - N/A

考察搜索的题目 DFS / BFS 往往难点不在于实现,而在于如何降低实现的复杂度,预处理和剪枝在搜索中非常重要,剪枝处理得当,暴力搜索也能有DP的效率。(不是所有题都能用DP。)

LeetCode - Search - Two Way BFS - N/A