随笔分类 -  Leetcode

算法题相关
摘要:class Solution: def removeKdigits(self, num: str, k: int) -> str: stack = [] for item in num: while stack and stack[-1]>item and k>0: k-=1 stack.pop(- 阅读全文
posted @ 2021-07-28 14:55 灰人 阅读(178) 评论(0) 推荐(0)
摘要:简直tmd绝了,位运算能被玩出这么多花活。 给个数如2,希望你把它的二进制数偶数位的全部右移动一个。例如以前是011010 现在希望是100101。 怎么做, ((num&0xaaaaaaaa)>>1 | (num&0x55555555)<<1) 直接得到答案。 用0xa来保留偶数位去除奇数位,然后 阅读全文
posted @ 2021-07-21 14:44 灰人 阅读(53) 评论(0) 推荐(0)
摘要:题目就是给你n=3 然后你就要生成3对括号的有效形式。例如()()()和(()())这种 思路,肯定是递归了。递归每次增加一个左括号一个右括号,就会成为)(()(),所以还要加限制。 这种题,先递归出来,结果多了再用限制去做减法: n = 3 opt = [] def khsc(ipt): if l 阅读全文
posted @ 2021-07-21 09:22 灰人 阅读(53) 评论(0) 推荐(0)
摘要:可以说这道简单的面试题让我学到了太多太多的东西了。 首先这道题是这样的: 那么这道看起来容易的“面试题”要考察什么知识点呢? 我第一时刻想到的是,排序+比较。比较确信自己的思路应该是对的。 易如反掌!通过了。 当然想到还可以用元组,但是没想到这个题还有很多其他的东西。例如有人想到用位运算的方法来解决 阅读全文
posted @ 2021-07-18 17:40 灰人 阅读(40) 评论(0) 推荐(0)
摘要:说白了还是递归写不明白,不知道怎么去递归。那么找到一个兄弟的代码非常具有教育意义,虽然写的不是很好,但是思路看起来非常清晰。 首先我们确定了这个东西的行为就是栈的行为了,而且想找到所有的方案考虑用递归去实现这个问题。 那么问题来了递归到底咋写。 我们首先要确定好输入和输出,输出不用说了我们只想要这些 阅读全文
posted @ 2021-07-13 17:32 灰人 阅读(819) 评论(0) 推荐(0)
摘要:前序遍历: result = [] st = [root] while st: node = st.pop(-1) if node.right: st.append(node.right) if node.left: st.append(node.left) result.append(node.v 阅读全文
posted @ 2021-06-28 10:13 灰人 阅读(158) 评论(0) 推荐(0)
摘要:这题恶心人在你需要设计一个时间复杂度在O(logn)的算法,看到logn基本就能想到是二分法了,但是怎么二分呢。因为整个nums是按照升序已经排列好的,所以我们可以通过mid = (left+right )/2的方式得到。其中,在第一轮的时候left=0而right = len(nums)。这里le 阅读全文
posted @ 2021-06-03 14:53 灰人 阅读(39) 评论(0) 推荐(0)
摘要:这道题我们学到了一个重要知识点和一个好用的小技巧。 先说小技巧,当我们想把字典中key为m的值加1的时候,如果这个key不在字典里那么会报错。不使用defaultdict的话,我们可以使用:count[m] = count.get(m,0) + 1 get拿不到m的话就为0了,然后+1。如果能拿到那 阅读全文
posted @ 2021-05-28 15:12 灰人 阅读(53) 评论(0) 推荐(0)
摘要:这一题我最开始走到了思维误区,认为应该把输入先按0切分开来,然后再考虑负数的情况。这种思维倒是符合正常的思维模式,但是思考到分开之后大量的子数组段保存需要较大空间,而且处理起来很复杂,这时候就应该思考一些别的思路而不是继续优化它了。 动态规划的思想似乎在这道题的样子里若隐若现,可惜不是加和而是相乘, 阅读全文
posted @ 2021-05-28 10:12 灰人 阅读(71) 评论(0) 推荐(0)
摘要:这题暴力法时间不够,需要进行优化。 先排序是肯定的。 1.最外层遍历所有元素都遍历一次是没问题的,但是要注意两点:1.因为排序了所以nums[i](最外循环的元素)大于0的时候就没有解了,后面都是大的直接break就好。 2.nums[i]和nums[i-1]不能相同,否则就重复了。 2.第二第三层 阅读全文
posted @ 2021-03-28 14:07 灰人 阅读(57) 评论(0) 推荐(0)
摘要:快慢指针来找到重复数的思路,一直没有很清楚,这回系统的学习了一下。 首先,快慢指针 又叫Floyd 判圈算法又叫龟兔赛跑算法。其目的是为了找到一个链表是否会有环。这个很好理解,一个快指针每次走两个next一个慢指针正常走一个next,如果链表中是有个环的,他们两个指针首先都会进入到环内,之后他们两个 阅读全文
posted @ 2021-03-26 16:09 灰人 阅读(245) 评论(0) 推荐(0)
摘要:迭代法说白了就是用栈模拟了递归解法的过程,先上代码: # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val 阅读全文
posted @ 2021-03-17 09:54 灰人 阅读(588) 评论(0) 推荐(0)
摘要:二叉搜索树迭代器 这题主要是读题,理解了题意就好做了。题中主要的目的是完成: 1.next()函数,用来获得下一个最大值 2.hasnext()函数,用来获得是否有下一个节点 3.init函数,初始化的时候需要做的工作 那么思路就很清晰了,我们将所有节点的值保存在一个list里面,然后访问的时候就简 阅读全文
posted @ 2021-03-17 08:54 灰人 阅读(65) 评论(0) 推荐(0)