![](https://img-blog.csdnimg.cn/20210121150959423.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode
文章平均质量分 60
秃头
美式因子
美式我需要
展开
-
位运算
领略位运算之美在阅读之前先补充一下计算机的二进制运算逻辑运算:与,或,非,异或运算 XOR与运算符号为&,运算规律是:真真为真,真假为假,假假为假或运算符号为|,运算规律是:真真为真,真假为真,假假为假非运算符为~,取反的逻辑,运算规律:二进制位若为1,取反后为0。若为0,取反后为1异或运算XOR一个值与自身的运算,总是为 false。x ^ x = 0一个值与 0 的运算,总是等于其本身。x ^ 0 = x正数、负数的表示对于负数的表示原创 2021-04-25 22:07:44 · 205 阅读 · 1 评论 -
递归,迭代在链表中的运用
82_删除链表中的重复节点283_删除链表中的重复节点1这两道题的不同点是,82要求删除重复的节点,83式要求保留自身,删除与自身相同的节点。递归对于82题递归结束的条件是与当前节点不同的下一个节点,将重复节点的下一个不一样节点进行递归class Solution(object): def deleteDuplicates(self, head): if not head or not head.next: return h...原创 2021-03-26 22:45:39 · 162 阅读 · 0 评论 -
leetcode——逆波兰表达式求值,pyhon3负数运算需要注意的点
150. 逆波兰表达式求值首先要知道数字在python3的运用负数用isdigit()无法判断是数字/是保留小数,//是保留整数,但是是往小的保留这里就要考虑负数的取整问题解决办法:try-except ,或者字符串截取lstrip(’-’)解决判断负数是数字的问题。使用 int() 函数,解决负数取整问题代码思路对逆波兰表达式求值的过程是:如果遇到数字就进栈;如果遇到操作符,就从栈顶弹出两个数字分别为 num2(栈顶)、num1(栈中的第二个元素);计算 num1 运算 num原创 2021-03-21 10:02:57 · 396 阅读 · 0 评论 -
Leetcode——单调栈的认识及运用(下一个更大元素 II等)
对于栈的认识一开始我只停留在先进先出,对于它的运用我并没有过多的思考,知道这两天的刷到才知道我也知道一个概念,那么这个先进先出有什么可以运用,现在的理解是单调递增或者单调递减,可以与栈顶元素比较,比如是单调递增的栈,如果当前元素比栈顶元素小,也就是说是整个栈元素的最小值,就会将栈顶元素弹出,当前元素为栈顶元素,以此类推。对于这道题,首先要思考我们为什么要用单调栈,是用单调递增还是递减,题目是求的是循环数组的第一个比它大的值,也就是说当前元素比栈顶元素大就行,为什么要用单调栈呢?考虑比较次数,比如对于数组原创 2021-03-06 12:10:48 · 216 阅读 · 2 评论 -
python heapq模块解决经典 TopK 问题
官网Leetcode原创 2021-03-02 09:06:37 · 216 阅读 · 0 评论 -
Python中切片这把好利器——解决托普利茨矩阵
766. 托普利茨矩阵直接遍历的话时间复杂度回比较高,利用切片可以遍历一次class Solution: def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool: for i in range(len(matrix) - 1): if matrix[i][:-1] != matrix[i + 1][1:]: return False ret原创 2021-02-22 11:52:34 · 79 阅读 · 0 评论 -
Leetcode——滑动窗口实现求最大最小值,Pyhthon利用第三方sortedcontainers和队列实现
因为题目返回最长连续子数组的长度,,是该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。可以转化为是在这个连续子数组的最大最小值相减不超过limit滑动窗口 + 单调队列思路:在实际代码中,我们使用一个单调递增的队列 queMin 维护最小值,一个单调递减的队列 queMax 维护最大值。这样我们只需要计算两个队列的队首的差值,即可知道当前窗口是否满足条件。每次右指针移动都需要获取序列的长度对于右指针所指的新元素,判断是否要更新queMin,queMax的第一位元素(最小值,最原创 2021-02-21 14:23:24 · 508 阅读 · 1 评论 -
Leetcode——BFS在树和图结构中的运用
pythons模板BFS 使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS 总共有两个模板:如果不需要确定当前遍历到了哪一层,BFS 模板如下。while queue 不空: cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未访问过: queue.push(该节点)但是用 BFS 来求最短路径的话,以上这个框架还需要稍微修改一下。如果用上面这种写法原创 2021-02-15 14:52:02 · 87 阅读 · 0 评论 -
Leetcode——633. 平方数之和
class Solution: def judgeSquareSum(self, c: int) -> bool: if c == 1 or c== 0 : return True left = 0 right = int(math.sqrt(c)) print(right) while left <= right : if left * left + right * r..原创 2021-02-01 16:14:49 · 65 阅读 · 0 评论 -
Leetcode有向图无向图,一题多解,并查优先队列都给我冲
并查集778. 水位上升的泳池中游泳class Solution(object): def swimInWater(self, grid): """ :type grid: List[List[int]] :rtype: int """ N = len(grid) nodes = [None] * (N * N) for i in range(N): fo原创 2021-02-01 16:04:15 · 262 阅读 · 0 评论 -
Leetcode——前缀和
题目直通车运用数学思想左边的和 = 总和 - 当前索引的值-右边的和题目要求两边相等,也就是 左边的和 = 右边的和因此公式变成 左边的和 + 左边的和(右边的和) +当前索引的值 = 总和class Solution: def pivotIndex(self, nums: List[int]) -> int: if not nums: return -1 total = 0 for j in range(len(nums)):原创 2021-01-28 21:18:36 · 115 阅读 · 2 评论 -
Leectcode——滑动窗口
76. 最小覆盖子串滑动窗口的思想:用i,j表示滑动窗口的左边界和右边界,通过改变i,j来扩展和收缩滑动窗口,可以想象成一个窗口在字符串上游走,当这个窗口包含的元素满足条件,即包含字符串T的所有元素,记录下这个滑动窗口的长度j-i+1,这些长度中的最小值就是要求的结果。import collectionsdef minWindow(s: str, t: str) -> str: need = collections.defaultdict(int) for i in t:原创 2021-01-28 20:09:23 · 123 阅读 · 0 评论 -
Leetcode——玩转双指针
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。 若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是 排好序的。167. Two Sum II - Input array is sorted (Easy)解题思路:使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的.原创 2021-01-25 16:03:14 · 109 阅读 · 0 评论 -
Leetcode——唯唯诺诺对并查集的初次相见
基本概念并查集是一种数据结构 并查集这三个字,一个字代表一个意思。 并(Union),代表合并 查(Find),代表查找 集(Set),代表这是一个以字典为基础的数据结构,它的基本功能是合并集合中的元素,查找集合中的元素 并查集的典型应用是有关连通分量的问题 并查集解决单个问题(添加,合并,查找)的时间复杂度都是O(1)O(1)并查集的实现数据结构并查集跟树有些类似,只不过她跟树是相反的。在树这个数据结构里面,每个节点会记录它的子节点。在并查集里,每个节点会记录它的父节点。c原创 2021-01-25 14:52:47 · 69 阅读 · 0 评论 -
Leetcode——贪心算法之无重叠区间,种花问题,最长递增序列
直通车biu思路:官网说的很难懂(没有通俗易懂)在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间 就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区 间。 具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。class Solution: def eraseOverlapIntervals(self, intervals: List[List[..原创 2021-01-23 20:41:07 · 129 阅读 · 0 评论 -
Leetcode——贪心算法之分发糖果
参考算法思路:我们只需要简单的两次遍历即可:把所有孩子的糖果数初始化为 1; 先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。通过这两次遍历, 分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。在样例中,我们初始化糖果分配为[1,1,1],第一次遍历更新后的原创 2021-01-22 14:27:21 · 133 阅读 · 0 评论 -
LeetCode——989. 数组形式的整数加法
官网我觉得这个超级有意思from typing import Listdef addToArrayForm(A: List[int], K: int) -> List[int]: i = len(A) - 1 while K: A[i] = A[i] + K K = A[i] // 10 A[i] = A[i] % 10 i = i - 1 if i< 0 and K: .原创 2021-01-22 11:58:33 · 49 阅读 · 0 评论 -
Leetcode——二叉树
相同的树如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。# Definition for a binary tree node.# class TreeNode:# def __init__(self.原创 2021-01-21 22:42:48 · 88 阅读 · 0 评论 -
用心感受♥回溯在Python3的应用——需要剪枝的
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]数字可以无限制重复被选取产生重复的原因是:在每一个结点,做减法,展开分支的时候,由于题目中说 每一个元素可以重复使用,我们考虑了 所有的 候选数,因此出现了重复的列表。class Soluti原创 2021-01-20 22:30:36 · 149 阅读 · 0 评论 -
237.删除链表中的节点
官网请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 – head = [4,5,1,9],它可以表示为:题解一:这方法太笨了!!!!好蠢/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } *//** * @param {ListNode} nod原创 2020-08-01 21:53:29 · 80 阅读 · 0 评论 -
算法初识——斐波那契数
复杂度时间复杂度估算程序指令的执行次数空间复杂度估算所需占用空间斐波那契数动态规划优化:优化上述方法:只需要存放前两个值即可,减小空间消耗var fib = function(N) { if(N==0)return 0; if(N==2||N==1)return 1; var prev=1,curr=1; for(var i=3;i<=N;i++){ var sum=prev+curr; prev=curr;原创 2020-07-29 15:39:40 · 154 阅读 · 0 评论