刷题
换个名字就很好
这个作者很懒,什么都没留下…
展开
-
分割回文串lintcode136
回文串分割原创 2022-11-17 20:29:46 · 57 阅读 · 0 评论 -
lintcode652 factorization
dfs factorization 因式分解原创 2022-11-13 23:02:52 · 185 阅读 · 0 评论 -
最长连续递增序列
最长连续递增序列,双指针滑动窗口原创 2022-10-16 15:13:40 · 80 阅读 · 0 评论 -
最小覆盖子串
最小覆盖子串,双指针滑动窗口原创 2022-10-16 14:34:08 · 64 阅读 · 0 评论 -
最长回文子串
最长回文子串原创 2022-10-15 21:54:27 · 93 阅读 · 0 评论 -
HJ41称砝码
称砝码原创 2022-10-15 17:34:32 · 150 阅读 · 0 评论 -
AttributeError: ‘NoneType‘ object has no attribute ‘sort‘
返回一个没有返回变量的函数会报'NoneType' object has no attribute 'sort',解决方法是直接调用,然后返回之前定义并作为该函数参数的引用传递变量。原创 2022-07-16 12:44:19 · 1239 阅读 · 0 评论 -
previous permutation lintcode51
previous permutation 超时dfs版本原创 2022-07-01 09:41:29 · 114 阅读 · 0 评论 -
Memory Limit Exceeded
lintcode刷题报错Memory Limit Exceeded,可能是死循环或列表导致。原创 2022-06-22 18:02:33 · 1822 阅读 · 0 评论 -
lintcode654稀疏矩阵相乘
list用不了numpy的切片,比如如果a是numpy, a[:][2]取的是所有行的第2列的元素,如果是list of list,a[:][2]取的是第2行的所有元素,因为在list里[:]取当前列表本身,同样的,a[2][:]也是取的第二行所有元素,a[2][:]等效于先取a的第二行所有元素,然后在此基础上取本身,所以还是a的第二行所有元素。list和numpy都可以用zip。from typing import ( List,)class Solution: """原创 2022-05-20 21:32:10 · 131 阅读 · 0 评论 -
lintcode 528 摊平嵌套的列表
思路:递归遍历这个列表,将列表元素放入到递归函数中。递归函数具体是,如果这个元素是个整型数,加入到摊平列表中,否则就是列表,就继续递归。最后得到摊平了的列表,处理一下即可。以下版本超时,到92%的测试例子时用时5秒:"""This is the interface that allows for creating nested lists.You should not implement it, or speculate about its implementationclass Neste原创 2022-04-17 23:49:23 · 132 阅读 · 0 评论 -
lintcode42最大子数组
描述给定一个数组,求两个不重叠的子数组,使得这两个子数组的和最大。思路dp由于我之前做过k个子数组的题目,令k=2可以直接套用。lintcode43最大子数组时间复杂度O(nk)空间复杂度O(nk)from typing import ( List,)class Solution: """ @param nums: A list of integers @return: An integer denotes the sum of max two non-原创 2022-03-29 19:44:04 · 188 阅读 · 0 评论 -
lintcode404子数组求和II
描述给定一个数组和一个范围,求子数组的和在这个范围的所有子数组数。思路暴力枚举,O(n^2)超时:from typing import ( List,)class Solution: """ @param a: An integer array @param start: An integer @param end: An integer @return: the number of possible answer """ def原创 2022-03-28 21:15:54 · 420 阅读 · 0 评论 -
lintcode4丑数
丑数如果一个数的因数只有质因数3,5,7,那么这个数是丑数。特别的,1 也是丑数。前10个丑数是1,2,3,4,5,6,8,9,10,12。求第n个丑数。思路最先想到的是枚举的方法,从1开始,一直判断每个数是不是丑数,找到第n个丑数,这个方法不可行的原因是效率太低,第一,每次判断需要时间,第二,越到后面丑数越来越少,要遍历很多个数才能得到一个丑数。换个思路,直接生成丑数,生成的第n个就是答案。观察到丑数的规律,如果i是丑数,i*2,i*3,i*5也是丑数。用最小堆。每次从堆中取出最小的丑数,将原创 2022-03-27 16:06:12 · 409 阅读 · 0 评论 -
lintcode393买卖股票的最佳时机IV
描述给定n天的股票值和允许的最大交易次数k,问最大利润。已经买了一只股必须要卖出去才能买下一支股。思路dp。当k>=n//2时,达到n天交易次数的饱和,这时,只要一有利润就会有收入。具体在实现上,相邻两天如果是股票值上升的,就记入利润。其余情况,用dp。首先考虑状态,本题有两个,第几天和第几次交易。dp[i][j]dp[i][j]dp[i][j]代表第iii天第jjj次交易完成后的利润。状态转移方程:dp[i][j]=max(dp[i−1][j],dp[m][j−1]+p[i]−p[原创 2022-03-26 14:55:18 · 348 阅读 · 0 评论 -
lintcode43最大子数组
描述给定一个数组nums和一个数k,求把数组分成k个子数组时和最大的值。思路dp。当数组长度等于k时,全部选。当数组长度小于k时,无解。当数组长度大于k时, #local/global[i][j]表示前i个元素分成j个子组时和最大值 #local[i][j]时第i个必选,为了如果第i+1个想跟前面的元素一组时可以拼一起 #global[i][j]时第i个不一定选 # local[i-1][j]表示nums[i]加入上一个子数组原创 2022-03-24 21:26:23 · 241 阅读 · 0 评论 -
lintcode448二叉树中序后继
描述给一个二叉树和节点p,保证p在二叉树内,求p的后继思路如果当前的root小于或等于p,返回右子树的结果。否则,获取左子树的递归结果,如果结果为null,返回当前的root,否则返回递归结果。"""Definition for a binary tree node.class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right原创 2022-03-23 15:49:26 · 548 阅读 · 0 评论 -
n皇后 力扣51
描述求n皇后的所有解。同行同列两个方向的对角线最多只能有一个皇后,在n*n的棋盘摆上n个皇后。回溯法每一个位置,有且只有两种情况,能或不能摆皇后。能摆皇后有两种选择,摆或不摆。综合一下,就是,在能摆的时候,摆或不摆。因为在不能摆的时候只能不摆,也就是能摆的时候的不摆的情况。回溯就是回到递归的调用处,在执行下一次递归之前还原现场。还原现场是,递归调用之前有做一些操作,还原成做这些操作之前的样子。加速能不能摆的条件的判断可以加速,特别是两条对角线的方向的判断。左下角到右上角的方向记为rup原创 2022-01-07 16:52:25 · 390 阅读 · 0 评论 -
a的b次方对p取模 a乘b对p取模 快速幂
思路:对b用二进制表示,分开操作防止溢出。对b用二进制表示:b=b0∗20+b1∗21+b2∗22+...+bn∗2n,bi=0 or 1,i=0,..,nb=b_0*2^0+b_1*2^1+b_2*2^2+...+b_n*2^n,b_i=0 \ or\ 1,i=0,..,nb=b0∗20+b1∗21+b2∗22+...+bn∗2n,bi=0 or 1,i=0,..,nab=ab0∗20+b1∗21+b2∗22+...+bn∗2n=ab0∗20∗ab1原创 2022-01-04 16:03:30 · 661 阅读 · 0 评论 -
最长公共子序列leetcode1143
给你两个字符串,求这两个字符串最长公共子序列的长度。第一个字符串为str1, 第2个字符串为str2。用dp。动态转移方程为:dp[i][j]为str1走到第i个字符,str2走到第j个字符串时,最长公共子序列的长度。当str[i]等于str[j]时,dp[i][j]=dp[i-1][j-1],否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1])。初始化,i==0 or j==0 ,并且str1[i]==str2[j]时,dp[i][j]=1。class Solutio原创 2021-12-10 16:31:25 · 62 阅读 · 0 评论 -
合法括号的所有组合
给定一个n,问你所有n个合法括号的组合。用递归,每一次选择左括号或后括号,选左括号的条件是左括号的数目小于n,选右括号的条件是右括号的数目小于左括号的数目,递归后记得还原现场,递归出口是右括号的数目等于n,把这个组合加入到答案列表里然后返回。见鬼了,同样的思路和实现,用台式机做出来了,当时用笔记本电脑就做不对。:)def dfs(num_left, num_right, sub_ans_str, ans_list, n): if num_right==n and num_left==n:原创 2021-11-19 10:01:41 · 460 阅读 · 0 评论 -
归并排序python
归并排序的思想是分而治之。把数组分成两半,每一半都递归调用自身进行排序,然后合并已经排好序的两半。def merge_sort(array): if len(array)>1: mid = len(array)//2 L = array[:mid] R = array[mid:] merge_sort(L) merge_sort(R) k, i, j = 0, 0, 0原创 2021-11-18 18:03:27 · 177 阅读 · 0 评论 -
快速排序python
快排的思想是分而治之。对于一个无序array,令start为0, end为len(array)-1,选一个数作为pivot,交换这些数的位置,使得pivot左边的数都小于等于pivot,右边的数都大于pivot,返回pivot的下标p,然后分别对p左边的区间和p右边的区间进行同样的操作,直到array有序。def partition(start, end, array): pivot_index = start # 令开始的下标为pivot_index pivot = array[pi原创 2021-11-18 17:03:06 · 207 阅读 · 0 评论 -
二叉树的前中后序遍历
pre:visitpre(left)pre(right)in:pre(left)visitpre(right)post:post(left)post(right)visitclass Node(): def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = rightdef inorder(roo原创 2021-11-18 14:28:02 · 53 阅读 · 0 评论 -
linked list inverse
如果加结点是加在结尾的,有两种inverse方法,第一种比较笨的是在创建一个新的链表,遍历原来的链表,把结点以加到开头的方式加到新链表,返回新链表,时间复杂度O(n),空间复杂度O(n)。第二种,推荐用法,原地置换,首先初始化prev为空,next为空, cur为头结点,循环当cur不为空,保存cur的下一个结点为next,改变cur的下一个结点为prev,prev和cur向前一步,循环直到cur为空,最后令prev为头结点,完毕。class Node(): def __init__(sel原创 2021-11-18 11:03:51 · 244 阅读 · 0 评论 -
分割字符串lintcode680
给定一个字符串,问你分割成一个或相邻两个的所有情况。dfs:递归到当前字符,有两种选择,与下一个字符连一起,或不连一起,然后继续递归,还原现场。如果与下一个字符连一起,下一次递归就从下一个的下一个字符开始,如果不连在一起,下一次递归就从下一个字符开始。递归出口,如果当前字符是最后一个字符时,没得选,只能是不连的情况,如果是倒数第二个,有两种选择,连或不连。sub_list append到ans的时候要有冒号,否则后面修改sub_list,已经append到ans里的也会被修改。class Solu原创 2021-11-17 16:09:31 · 62 阅读 · 0 评论 -
经典二分查找问题lintcode457
给一个上升序列,返回target出现的任意位置,没有返回-1。class Solution: """ @param nums: An integer array sorted in ascending order @param target: An integer @return: An integer """ def binary_search(self, nums, low, high, target): if low<=high:原创 2021-11-16 21:29:24 · 63 阅读 · 0 评论 -
丢鸡蛋lintcode584
有m个鸡蛋,n层楼,问你最坏情况下最少扔多少次鸡蛋可以确定鸡蛋没碎的最低楼层。有两种方法,本质一样的,第一种递归,会超时但能出来结果,第二种动态规划。第一种递归当楼层是10还好,如果是100,程序会运行很久,几分钟也没出来结果,还在递归,提交了也不能过,但是对第二种解法有启发性。递归方程:dropeggs(m,n) = min(1+max(dropeggs(m-1,x-1),dropeggs(m, n-x)),x=1,…n)递归出口:当m为0或m为0返回0,当m为1返回n,当n为1返回1。原创 2021-11-16 20:59:29 · 226 阅读 · 0 评论 -
目标出现总和lintcode462
给定一个升序序列,问你target在序列中一个出现几次。二分的变体,在经典的二分模板的arr[mid]等于target的时候左右都遍历一下把是target的加上去就行了,当然了,当前的这个值等于target,ans也要加一。二分查找时间复杂度O(log n)。class Solution: """ @param A: A an integer array sorted in ascending order @param target: An integer @retur原创 2021-11-13 19:08:13 · 51 阅读 · 0 评论 -
目标最后位置lintcode458
有一个上升序列,问你target在序列中最后出现的位置,没有的话返回-1。用二分查找法。当l<=r时,mid=l+(r-l)//2,当arr[mid]等于target并且它是最后出现位置时直接返回,最后出现位置的判别方法是mid是序列的最后一位,或者不是最后一位但是它的下一位比target大。如果target<arr[mid],那么ans一定比mid小,那么往左边查找,令r=mid-1,递归调用查找函数。剩下的情况就是arr[mid]<target或者arr[mid]等于targe原创 2021-11-13 18:37:36 · 152 阅读 · 0 评论 -
二叉搜索数中最近的值 lintcode 900
给定一棵二叉搜索数和一个target值,要你输出二叉搜索树中里target值最近的值。用中序遍历,到当前节点,判断一下如果当前节点和target值的差的绝对值比历史的要小,就更新min_dff,min_diff_key,然后继续遍历直到节点为空。如果当前节点为空,直接返回。如果当前节点等于target,更新min_diff,min_diff_key后返回 。当前节点处理完,如果target比当前节点要小,往左边走,如果target比当前节点要大,往右边走。min_diff ,min_diff_key分别是原创 2021-11-13 16:15:28 · 211 阅读 · 0 评论 -
连通块个数 lintcode433
给定一个由0,1组成的二维数组,1为通,0不通,考虑上下左右为通的可以连通在一起,问连通块个数。三种解法,bfs, dfs, union_find。bfs用队列实现,为1的入队。队头出队,它上下左右如果有为1的并且没出界的依次入队,直到队列为空。进入过队列的原地置0来防止再次进队。m*n的二维数组每一个点,依次遍历,如果为1就进行bfs。进行bfs的次数是连通块的个数,未遍历到的点可能在之前的bfs中被置0,所以此法可行。dfs用递归实现,如果是1,原地置0,对它的上下左右是1并没出界的点进行递归调原创 2021-11-12 21:38:28 · 722 阅读 · 0 评论 -
实现栈 lintcode495
实现一个栈,可以使用除了栈以外的数据结构。样例:输入:push(1)pop()push(2)top() // return 2pop()isEmpty() // return truepush(3)isEmpty() // return falseclass Stack: """ @param: x: An integer @return: nothing """ def __init__(self): self.list_ =原创 2021-11-04 19:00:26 · 56 阅读 · 0 评论 -
数据流滑动窗口平均值 lintcode642
给出一串整数流和窗口大小,计算滑动窗口所有整数的平均值。样例:MovingAverage m = new MovingAverage(3);m.next(1) = 1 // 返回 1.00000m.next(10) = (1 + 10) / 2 // 返回 5.50000m.next(3) = (1 + 10 + 3) / 3 // 返回 4.66667m.next(5) = (10 + 3 + 5) / 3 // 返回 6.00000class MovingAverage(object):原创 2021-11-04 17:41:21 · 116 阅读 · 0 评论