![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每天都刷leetcode
文章平均质量分 52
皮皮鲁与鲁西西�
这个作者很懒,什么都没留下…
展开
-
拼积木—— 不同条件下的暴力dfs or 动规
小毛同学参加了搭积木竞赛,主办方提供了一个大小为Lx2(L原创 2022-10-09 16:29:45 · 220 阅读 · 0 评论 -
单调栈的常见用法
单调栈原创 2022-09-13 22:56:06 · 179 阅读 · 0 评论 -
【上/下一个排列】找断层+找紧邻+交换+逆排列
从右往左找第一个非递增,然后在区间从右往左找第一个比它大的,替换+逆序。从右往左找第一个非递减,然后在区间从右往左找第一个比它小的,替换+逆序。【注意】不等于逆序后做下一个排列后再逆序回!原创 2022-09-03 22:27:43 · 132 阅读 · 0 评论 -
快速排序的python实现
递归实现:def quicksort(arr, start, end): if start >= end: return pivot = arr[start] low, high = start, end while low < high: while arr[high] >= pivot and low < high: high -= 1 arr[low] = arr[hig原创 2021-11-12 16:17:37 · 454 阅读 · 0 评论 -
【微软、蚂蚁笔试】连续/不连续子字符串问题,状态前缀动态哈希/排列组合
动态哈希+状态压缩原创 2022-08-30 21:56:10 · 803 阅读 · 0 评论 -
【秋招笔试复盘】秋招的第一场笔试——网易
秋招笔试复盘——网易篇原创 2022-08-20 22:51:18 · 232 阅读 · 0 评论 -
【数组循环移位】的四种解法
将一个数组循环左移k位,返回移动后的数组。其中,循环左移的含义为:原nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],循环左移k位后,nums = [5, 6, 7, 8, 9, 10, 1, 2, 3, 4]。常规解法1:拷贝时间复杂度o(n),空间复杂度o(n)新开辟一个数组,从原数组中拷贝。常规解法2:k次移位时间复杂度o(kn),空间复杂度o(1)经过k次循环移位1位技巧解法1:转置时间复杂度o(n),空间复杂度o(1)将目标以k为分界线,分为前半部分原创 2022-04-25 19:05:28 · 2359 阅读 · 0 评论 -
【腾讯笔试】一元三次方程求根 —— 万能的二分
一元三次方程,若已知必有一正实根,求根(若有多个根只需求任意一个)二分解法数值法,用二分去逼近解的区间,高中数学流程图那章有类似的题。对于区间[a,b],若满足下式,则区间内必有一根。对于必有一根的区间[a,b],可以如下所示用二分去缩小区间。停止条件为解的误差(即区间长度)小于某值或者解代入函数十分接近0。核心代码如下:ans = 0while (r-l) > 10**(-7): mid = (l+r)/2 fmid = f(mid, a, b, c) i原创 2022-04-24 22:57:40 · 388 阅读 · 0 评论 -
力扣随机数randX——透过现象看本质之二元独立随机分布
用randX 实现 randY(X < Y)其中,randN表示等概生成[1,N]的数从一个力扣上的例子来引入吧470. 用 Rand7() 实现 Rand10()最直观的想法是用rand7()+rand7()-1去生成[1, 13]的数,然后只取[1, 10],但实际上这里的每个数并不是等概的,例如1的概率是1/49(1+1),但10的概率是4/49(4+7,5+6,6+5,7+4)。所以该方法并不可行。事实上,可以把第一个rand7()和第二个rand7()分别看成两个维度,假设分别为A原创 2022-04-23 21:09:31 · 758 阅读 · 0 评论 -
python并查集模板
1319. 连通网络的操作次数class UnionFind(): def __init__(self, n): self.parent = list(range(n)) self.setcnt = n ## 连通分量数 self.size = [1]*n ## 每个连通分量的大小 def findset(self, x): if self.parent[x] == x: return x原创 2022-03-20 17:59:20 · 1213 阅读 · 2 评论 -
力扣之数组重复/缺失/超过一半的元素题解大全【持续更新】
最近刷力扣总能碰到各种关于数组数字元素的题目,而且这些题基本都有很多巧妙的多重解法,博主自己想不出,只能靠大量的记录了。287. 寻找重复数不考虑题目的限制条件,立马想到的解法是:①边遍历边加入set, 直到出现一个原本就存在set中的元素②遍历并交换数组元素到相应位置上[数字x应填入下标x-1中], 直到出现一个元素与相应位置相等, 就找到了重复元素了但是以上解法1需要用到额外的o(n)空间, 解法2需要修改原数组, 都不满足条件…这时猪脑过载了, 只能去看大佬解析解法一: 二分查找仔.原创 2022-03-18 20:33:02 · 461 阅读 · 0 评论 -
背包变种的动规问题【持续更新】
动态规划问题(背包问题)的精髓就是枚举所有可能情况,为转移做准备一、满减凑单问题:在凑够满减条件的前提下,让选出来的商品价格总和最大程度的接近满减条件与leetcode416有异曲同工之妙。用布尔变量dp[i][j] 代表是否存在一种方案:使用前i件商品使得总价为j。# 4 30# 18 20 22 21n, Y = map(int, input().split())cost = list(map(int, input().split()))# y = sum(cost) ## 可以.原创 2022-03-17 22:38:08 · 400 阅读 · 0 评论 -
一些零零碎碎的面经中的算法题【持续更新】
阿里机器学习面经:对于题一:思路①:建立一个1-100的哈希表,遍历数组,同时从哈希表中弹出相应值。最终哈希表中剩下的就是数组中缺失的。时间复杂度o(n),空间复杂度o(n)思路②:排序,然后看哪两个不相邻(或者看哪个元素与其下标不对应)。时间复杂度o(nlogn),空间复杂度o(1)思路③:类似于《找数组中重复的数字》一题修改数组的做法。遍历数组,对于下标为i的元素,判断其值与下标是否相等,若不等则替换到与其值相等的下标中去。注意:由于缺失一个元素,因此若遍历到100,则在放置时会溢出,那我们就原创 2021-11-27 10:04:01 · 288 阅读 · 0 评论 -
leetcode day 14【5186. 区间内查询数字的频率】第一次周赛
解题思路第一次用暴力—>超时第二次在初始化时用字典存每个数字出现的位置但查询时还是顺序查找---->超时第三次用字典+二分查找---->AC特别要注意这里定位left和right时有轻微差别,left返回的索引应该是不小于它的第一个值的索引(右边),right返回的是大于它的第一个值的索引的前一位(左边)。所以在编写binary_find时要用一个bool值区分左右两种情况。class RangeFreqQuery: def __init__(self, arr:.原创 2021-11-21 17:34:13 · 1875 阅读 · 0 评论 -
leetcode day 13【 6. Z 字形变换】flag的巧妙运用及多种情况的巧妙合并
解题思路以新字符串为基础,找到新字符串的逐个元素的在原字符串中的位置,逐一添加字符到新字符串中除了首行和尾行的offset是2n-2外,其余行都是两个offset(2n-2i-2,2i)轮流来虽然实现了,但是总感觉flag那里写的十分幼稚和啰嗦复杂度分析:原字符串中每个字符被访问一次,因此时间o(n),空间o(1)class Solution: def convert(self, s: str, numRows: int) -> str: if numRows .原创 2021-11-19 21:31:25 · 804 阅读 · 0 评论 -
leetcode day 12【 2042. 检查句子中的数字是否递增】创造边界条件以此简化代码
解题有点啰嗦class Solution: def areNumbersAscending(self, s: str) -> bool: numtoken = [] First = True for token in s.split(' '): if token.isdigit(): if not First: back = front ..原创 2021-11-18 10:09:58 · 74 阅读 · 0 评论 -
leetcode day 11【 105. 从前序与中序遍历序列构造二叉树】
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def buildTree(self, preorder: List[int], in.原创 2021-11-17 09:51:53 · 365 阅读 · 0 评论 -
leetcode day 10【 3. 无重复字符的最长子串】居然一次ac了
解题思路用两个指针,一前一后,前面的指针一步步往前试探新字符是否存在于两指针间的字符串中,不存在则往前挪,重复则移动后指针到重复元素的后一位。直到遍历完该字符串。class Solution: def lengthOfLongestSubstring(self, s: str) -> int: longest = '' i, j, maxlenth = 0, 0, 0 while True: while j <.原创 2021-11-16 00:41:08 · 1320 阅读 · 0 评论 -
leetcode day 9【 899. 有序队列】可以说是纯数学
解题思路对k分情况讨论:当K=1时,字符串构成一个有向环,所有可得到的字符串集合是:以任意字母为起点按方向遍历环。当K>=2时,可以证明到,可交换任意两相邻字符的位置,但不改变其他字符的位置------>可交换任意两个字符串的位置。所有可得到的字符串的集合是任意顺序。开撸:第一次不优雅的写法:class Solution: def orderlyQueue(self, s: str, k: int) -> str: if k == 1: .原创 2021-11-15 00:06:27 · 796 阅读 · 0 评论 -
leetcode day 8【 822. 翻转卡片游戏】从暴力到哈希
解题思路暴力class Solution: def flipgame(self, fronts: List[int], backs: List[int]) -> int: minnum = 0 samelist = [] for i in range(len(fronts)): if fronts[i] == backs[i]: samelist.append(fronts[i]) .原创 2021-11-12 23:58:40 · 3525 阅读 · 0 评论 -
归并排序的python实现
递归实现方式#!/usr/bin/python# -*- coding: utf-8 -*-def merge(l, m, r): L = arr[l:m+1] R = arr[m+1: r+1] i, j, k = 0, 0, 0 while i < len(L) and j < len(R): if L[i] <= R[j]: arr[l+k] = L[i] i += 1原创 2021-11-11 10:07:07 · 687 阅读 · 0 评论 -
leetcode day 7【 986. 区间列表的交集】从暴力到双指针
解题思路暴力解法对A中的每一块,都用B的每一块去做交集。复杂度o(n×m)class Solution: def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]: intersactList = [] if len(firstList)==0 or len(secondList)==0 : .原创 2021-11-09 22:50:20 · 1321 阅读 · 0 评论 -
leetcode day 6 【23. 合并K个升序链表】在图书馆苦思冥想的一天
解题:基本思路:从第二个链表开始,将每一个链表插入到前面基本链表中,这个更新后的链表作为基本链表。暴力解法:对新插入的链表中的每一个元素都去基本链表中从头找自己要插入的位置暴力解法稍稍优化后:对新插入的链表中的每一个元素都去基本链表中找自己要插入的位置,起始头从当前插入位置开始。# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# .原创 2021-11-07 22:46:13 · 204 阅读 · 0 评论 -
leetcode day 5 【 1351. 统计有序矩阵中的负数】从暴力到优化
解题思路暴力什么的就不搞了,直接上优化的算法。思路:从右上角开始,从右往左扫描,如果<0则其下面所有元素都<0(统计进来),直到碰到>0的,则该行查找完毕,跳入下一行。由于列和行都有规律,那么下一行不必从最右边开始,而是承接上一行的停止位来往前搜索,对每行依次执行直到达到退出条件(start=-1或所有行搜索完毕)。复杂度分析:对行来说,最多访问m次,对列来说,最多访问n列。所以个人觉得复杂度应该是o(min(m,n)),可以看到比 暴力 o(mn) 或者 二分 o(m.原创 2021-11-03 21:41:48 · 124 阅读 · 0 评论 -
leetcode day 4 【 045. 二叉树最底层最左边的值】二叉树遍历(DFS)或BFS
解题思路DFS(先序、中序、后序遍历)先序遍历二叉树,用一个depth记录当前深度,大于当前最大深度则替换,最后得到的一定是最深且最左边的。【如果题目要问最深且最右边的,就把替换条件从>换成>=】第一版:进入的时候depth+1,回溯的时候depth-1# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# .原创 2021-11-02 22:58:32 · 1154 阅读 · 0 评论 -
leetcode day 3 【207. 课程表】图拓扑排序
思路:图的拓扑序列,求序列长度是否等于顶点数即可。第一次:两个list分别记录入度顶点和出度顶点class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: inlist = [[] for _ in range(numCourses)] outlist = [[] for _ in range(numCourses)] .原创 2021-10-30 23:23:40 · 95 阅读 · 0 评论 -
leetcode day 2 【1905. 统计子岛屿】 BFS/DFS
解题思路BFS找到grid2中的每一座岛屿[暴力搜索整个grid矩阵],对每座岛屿BFS,过程中check岛屿格子是否在grid1中为岛屿。class Solution: def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int: row, col = len(grid2), len(grid2[0]) def BFS(x:int, y:in.原创 2021-10-30 12:15:27 · 179 阅读 · 0 评论 -
leetcode day 1 【1970. 你能穿过矩阵的最后一天】 二分查找+BFS/DFS
第一次尝试思路:二分查找 + BFS记录所有第一行是陆地(0)的元素,入队列。然后对每一个元素,去尝试BFS,看是否能到达底端。可以跑通也是对的,但超出时间限制。时间复杂度感觉是o(n^2mlogn)。并且代码很冗长,多此一举的flag(判断是否被找过)和两个队列(两个循环)【会重复对某些各自搜索】。class Solution: def latestDayToCross(self, row: int, col: int, cells: List[List[int]]) -> in..原创 2021-10-28 17:00:37 · 184 阅读 · 0 评论