09 2021 档案
摘要:第一个方法,维护一个大顶堆,其中有K个元素,遍历,算了没意思,不说了,贴代码 1 class Solution { 2 public: 3 int kthSmallest(vector<vector<int>>& matrix, int k) 4 { 5 priority_queue<int,vec
阅读全文
摘要:一看就知道要用什么花里胡哨的数据结构,就看了题解,果然用了大顶堆和小顶堆,两个堆中分别维护小于当前中位数的数和大于当前中位数的数。如果总数为奇数,则将中位数存储在小顶堆中,如果总数为偶数,则中位数为两个堆堆顶元素之和的一半。当然如果两个堆数量失衡,则需要进行调整,贴代码。 1 class Media
阅读全文
摘要:很有意义的一个题目。其实本质是在一个类中维护了两个栈,其中一个是正常的,另外一个维护的是最小元素,与其说维护的是最小元素,不如说维护的是该元素对应的元素被压入栈中时,该最小栈中的最小元素。其巧妙之处在于,若弹出的元素非最小元素,则最小栈中弹出的元素也不是唯一的,下面肯定还有。而若弹出的元素为当前最小
阅读全文
摘要:遇到的时候有点困难,看了答案发现还算直观。可以维护两个数组,一个代表第i个节点往左所有元素乘积,另一个代表往右所有元素乘积,然后再建立一个答案数组,乘一下即可。当然也可以只维护一个数组,比如先建立往左或者往右的,完成之后在新一轮循环中维护一个数,该数的值为当前节点往相反方向所有元素的乘积,在循环中乘
阅读全文
摘要:一道很有纪念意义的动态规划题目。动态规划的核心在于找到最优子结构,自己写的动态规划中,使用了近乎暴力的计算方法,用一个二维数组去存储乘积。固然可以,但是和动态规划的内核是不符的。所以需要在遍历的过程中维护当前节点之前的最大乘积和最小乘积,同时维护两个是因为当前节点值可能为负数,所以乘上最小乘积有可能
阅读全文
摘要:单词搜索的高级形式,在同一个矩阵中搜索多个单词。因为刚刚完成了tire也就是前缀树的撰写,整体写起来并不困难,使用深度优先搜索的递归就可以。然而问题出在效率上,尤其是所需要进行搜索的单词数量比较多的时候。进行了一些方面的修改。第一点是在完成一个单词的搜索之后就将该单词对应node的isend标志修改
阅读全文
摘要:其实就是一个用于存储字符的多叉树,每一个节点代表一个字符。每个节点还维护一个bool变量用于判断是否为某一字符串的结尾。通过数组实现,贴代码 1 class Trie { 2 public: 3 vector<Trie*> children; 4 bool isEnd; 5 6 /** Initia
阅读全文
摘要:先搞一个哈希表,键值是每个字典字符串的长度,对应的值是存储所有该长度字符串。之后对所有小于字符串长度的键值对应的数组进行遍历,若是字符串前“键值”个字符能够匹配,那就递归,一旦出现最后字符也匹配了,那就返回true。搞了个小心机,有个用例过不去,就写长度大于50的时候直接返回,投机取巧。 1 cla
阅读全文
摘要:先用动态规划搞出来每段字符是否是回文子串。之后写一个函数,不断从头开始向后走,并且判断中间的字符是否为回文子串,如果是,则递归,寻找剩下字符串所有的分割形式,返回之后就将返回的所有字符串组合加上本身这个回文子串,就完成了任务。但是执行出来效果较差,可能是递归的问题,但是逻辑算是比较清晰的,贴代码。
阅读全文
摘要:非常经典,综合的题目。这一道题想到二分查找是不困难的,但是要想把二分查找正确的应用起来则需要使用动态规划的方法。将动态规划函数设置为dp(k,n)。根据在某一点的扔鸡蛋结果,如果碎了,代表需要在当前楼层以下的楼中进行测试,并且可用的鸡蛋数量少了一个,所以递归的函数为dp(k-1,x-1),若是没碎,
阅读全文
摘要:放桶子的思想,首先遍历数组,记录出现次数最任务的次数以及并列的个数,设为m和x,由于存在冷却时间,单单执行最多次数的任务所需要的时间就是(m-1)*(n+1)+1,这就相当于放了m-1个桶,最后一个1是执行最后一个该任务的耗时,再加上需执行次数同样多的任务,则执行这些任务最少的时间变为(m-1)*(
阅读全文
摘要:摩尔投票法,首先将第一个元素设置为候选众数,并记录出现的次数,进行遍历的过程中,每一次出现与候选众数不同的数,其count就-1,若是候选众数,则+1,若是count变为0,则代表当前候选众数已经被消耗完全,选择下一个数作为候选众数,直到完成遍历,最后剩下的众数即为数组中的众数,贴代码 1 clas
阅读全文
摘要:用栈的结构就能很好的实现,贴代码 1 class Solution { 2 public: 3 int evalRPN(vector<string>& tokens) 4 { 5 stack<int> st; 6 int n = tokens.size(); 7 for(int i = 0 ; i
阅读全文
摘要:用位运算来实现该问题,用异或可以实现无符号的加法操作,然后需要使用与运算来实现进位,而负数因为是补码的形式存储所以能够得到正确的处理,十分巧妙的方法,贴代码。 1 class Solution { 2 public: 3 int getSum(int a, int b) 4 { 5 while(b!
阅读全文
摘要:我是傻逼。若结果中出现循环,每一次获得的余数也会是循环,所以用一个哈希表来存放所有的余数,当余数出现重复时,代表结果中也出现了重复,从而将左括号插入该余数的下标处,从而完成任务,贴代码 1 class Solution { 2 public: 3 string fractionToDecimal(i
阅读全文
摘要:还是二分法,整体并不困难,边界条件比较复杂,需要注意的比较多。贴原始代码 1 class Solution { 2 public: 3 int divide(int dividend, int divisor) 4 { 5 if(divisor == 1) 6 return dividend; 7
阅读全文
摘要:二分查找,不过查找过程中的判断条件更细一些,比如会判断mid以及mid+1的正确性,贴代码 class Solution { public: int mySqrt(int x) { if(x == 0) return 0; if(x == 1) return 1; long long x_temp
阅读全文
摘要:快速幂算法,真的牛皮,幂不断除以2取整,如果当前为偶数,则返回当前幂一半的值的数,再平方,若是奇数,那再乘上1个x好了,递归代码如下 class Solution { public: double generate(double x,int n) { if(!n) return 1; double
阅读全文
摘要:其实就是进制转换,第一个方法是递归,用迭代也是差不多的,贴一下递归的代码 class Solution { public: int generate(string& str,int& num_temp) { if(!str.length()) return num_temp; num_temp =
阅读全文
摘要:又是一个数学问题,并且最关键的方面还是归纳出题目的思路。对于这一题而言,在数的尾部出现0,出现了2*5这一组合,第一个思路就是把阶乘看成很多个数的因子相乘的过程,然后计算2和5的个数,这种思路可以继续优化,基于2的个数远大于5这一事实,我们只计算5的个数同样可以完成问题。之后需要解决的则是类似与25
阅读全文
摘要:虽然是一道简单题,但是简单的基础是对这个数学问题有足够的认识,最重要的就是要知道,不论多大的数,最终都会回到243以下,因为最大的三位数99经过一次操作后便是243,而更大的数操作后数位会不断减少,最后回到243以下。知道这一点是比较关键的,因为可以把所有数分为两类,一类是可以到达1的,一类是处于死
阅读全文
摘要:题意是通过一个数据结构来实现常数时间内的该三个操作。第一反应肯定是数组,数组能够完成获得随机元素的任务,但是要进行对某一元素的删除则存在困难。假如我们一拿到需要删除的数据,就能立马找到这个数据在数组中的下标,那就是可以在常数时间内实现的。这个操作则可以通过哈希表来实现,在往结构中添加数据的时候,将该
阅读全文

浙公网安备 33010602011771号