![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 56
皮皮鲁与鲁西西�
这个作者很懒,什么都没留下…
展开
-
拼积木—— 不同条件下的暴力dfs or 动规
小毛同学参加了搭积木竞赛,主办方提供了一个大小为Lx2(L原创 2022-10-09 16:29:45 · 220 阅读 · 0 评论 -
【进制转换】从高到低与从低到高两种思路
进制转换原创 2022-09-26 22:44:53 · 327 阅读 · 0 评论 -
单调栈的常见用法
单调栈原创 2022-09-13 22:56:06 · 179 阅读 · 0 评论 -
【上/下一个排列】找断层+找紧邻+交换+逆排列
从右往左找第一个非递增,然后在区间从右往左找第一个比它大的,替换+逆序。从右往左找第一个非递减,然后在区间从右往左找第一个比它小的,替换+逆序。【注意】不等于逆序后做下一个排列后再逆序回!原创 2022-09-03 22:27:43 · 132 阅读 · 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 评论 -
美团面试手撕 —— 往集合S中加入最少的数,使得集合T达到要求,那些我当时被冲昏了头脑的题
给定一个集合S, S到集合T的映射是S中的元素任意组合之和构成的集合。现在可以往S中加一些数,使得集合T能覆盖1至N,求加数的最少的个数。分析:1. 先通过一个例子来体会其中的规律假设S = {2, 3, 5},首先1必须加进去,1的加入使得集合变成了S1 = {1, 2, 3, 5},此时的T = {1,2,3,4,5,6,7,8,9,10,11},即T的区间为[1, 11],此时还不能达到目标。若想达到[1, 20],再往其中加任意一个大于位于区间[9, 12]的数都可以达到目标【因为小于9无法.原创 2022-04-02 23:25:50 · 204 阅读 · 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 评论 -
二叉树的前/中/后序遍历,递归+栈迭代实现[同门说今天字节刚面迭代版]
递归版本很简单就直接贴下代码了:前序## 递归实现class Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if not root: return [] return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)中序##原创 2022-03-16 21:41:54 · 936 阅读 · 0 评论 -
回溯大全【持续更新】
回溯本质上是靠递归实现的一种暴力搜索。基本思想是:尝试,如果不满条件就回溯,继续尝试,不满足就回溯,……如此反复,知道搜索完所有的解空间。尝试代表着一次选择,可以基于不同选择展开成多个解空间(树),到达叶子节点则代表找到一组解,但此时算法并未终结,依旧要向上回溯去尝试其他的解,直到遍历所有的可能情况。回溯有一个好处是可以剪枝,通过约束条件,去除不可能的尝试(解空间),缩小搜索范围。递归的题目:77.组合(组合问题)78.子集(子集问题)90. 子集 II(子集问题)46.全排列(排列问题)51.原创 2022-03-01 11:45:41 · 106 阅读 · 0 评论 -
力扣刷题数论相关,因式分解等【持续更新】
相关题目:2183. 统计可以被 K 整除的下标对数目原创 2022-02-21 17:05:51 · 259 阅读 · 0 评论 -
力扣刷题之单调栈【持续更新】
单调栈一般能化时间复杂度o(n^2) -> o(n),很巧妙leetcode中相关题目有:739. 每日温度84. 柱状图中最大的矩形402. 移掉 K 位数字316. 去除重复字母581. 最短无序连续子数组原创 2022-02-21 17:03:21 · 130 阅读 · 0 评论 -
队列、栈的互相实现及快速获取最大最小值等相关问题汇总
1.两个栈实现一个队列JZ9:用两个栈实现队列思路:不用每次出队完后都把栈B的元素倒腾回栈A。而是依照以下原则:入队都进栈A,出队都从栈B出,一旦要出队但栈B为空,就将栈A元素依次弹出并入栈B复杂度分析:由于每个元素都经历了进A出A和进B出B,因此时间复杂度o(n),空间复杂度o(n)代码实现:class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] def pu原创 2022-01-18 22:40:23 · 566 阅读 · 0 评论 -
动态规划专题【持续更新】
题目一: 机器人走无障碍物的方格的不同路径个数leetcode62. 不同路径解题思路典型的递归: f(m,n) = f(m-1,n) + f(m,n-1),到达当前位置的所有路径可以来自上面一格的down,也可以是左边一格的right。# 开辟一个dp内存,空间复杂度o(m*n)class Solution: def uniquePaths(self, m: int, n: int) -> int: dp = [[1]*n for i in range(m)]原创 2022-01-07 21:16:55 · 784 阅读 · 0 评论 -
剑指 day 12【JZ59 滑动窗口的最大值】滑窗集锦
解题思路分析: 这道题是滑窗中的最大值, 和之前的从头开始的最大值有所不同, 从头开始的可以永远保留此刻的最大值,新的最大值只会在新加入的元素和原最大值中产生。然而这道题的滑窗会让左边的元素出窗, 那么就可能导致原来的最大值过期, 因此比较复杂。暴力解法:对于每一次的窗都遍历一遍得到最大值。时间复杂度o(n*k), 空间复杂度o(1)优化暴力:不是每一次都去遍历窗, 而是维护一个最大值及其索引, 只有当最大值的索引超出了窗范围才去重新遍历窗得到新的最大值。时间复杂度o(n)-o(n*k), .原创 2021-12-24 11:34:11 · 457 阅读 · 0 评论 -
剑指 day 11【JZ38 字符串的排列】深入理解递归
解题思路递归思想: n个字符的排列可以转化为 先从n个字符当中pick出一个,然后再对剩余n-1个全排列。例如: abcd, f(‘abcd’) = [‘a’ + f(‘bcd’)] + [‘b’ + f(‘acd’)] + [‘c’ + f(‘abd’)] + [‘d’ + f(‘abc’)]找到这种前后递归关系后, 就可以轻松写下如下代码。但需要注意的是, 可能会有如下重复的情况出现, 因此, 用set来添加新排列。class Solution: def Permutation(se.原创 2021-12-23 11:00:56 · 362 阅读 · 0 评论 -
数据结构之二分查找及其变种
二分查找某元素值def binary_find(arr, x): st, ed = 0, len(arr)-1 while st <= ed: mid = (st+ed)//2 if arr[mid] == x: return mid # 找到并返回索引 elif arr[mid] > x: ed = mid - 1 else: st原创 2021-12-20 11:30:28 · 1025 阅读 · 0 评论 -
python的一些高效率写法【持续更新】
Python列表解析配合if else[i for i in range(k) if condition]:此时if起条件判断作用,满足条件的,将被返回成为最终生成的列表的一员[i if condition else exp for exp]:此时if…else被用来赋值,满足条件的i以及else被用来生成最终的列表print([i for i in range(10) if i%2 == 0])print([i if i == 0 else 100 for i in range(10)])原创 2021-12-19 12:45:02 · 600 阅读 · 0 评论 -
数据结构之二叉树的递归应用大全【持续更新】
前言:在递归时,我们经常需要判断某个节点是否满足条件。当满足条件时,我们希望进行一系列的操作。例如统计满足条件的节点个数,或是记录路径等。最简单直白的办法是维护一个全局变量。但很多情况我们想直接用一个递归完成任务,而不去额外设置全局变量,这就要充分利用起递归函数传递参数和返回值。在这篇文章中,我们避免使用全局变量,而更多地介绍如何巧妙利用递归传参和设置返回值完成任务。在剑指offer中的相关题目有:JZ82 二叉树中和为某一值的路径(一);JZ34 二叉树中和为某一值的路径(二);JZ84 二叉树.原创 2021-12-18 11:33:08 · 537 阅读 · 0 评论 -
leetcode 和剑指 中python的常用数据结构和简化代码小技巧汇总【持续更新】
队列- 实现方式一: Queue的基本FIFO队列添加元素:q.put(data)弹出元素:q.get()import Queueq = Queue.Queue()for i in range(5): q.put(i)while not q.empty(): print q.get()#输出为 0,1,2,3,4- 实现方式二:list列表添加元素:q.append(data)弹出元素:q.pop(0)q = []for i in range(5)原创 2021-11-19 09:56:18 · 791 阅读 · 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 评论 -
希尔排序的python实现
排序的顺序其实并非按照各分组依次插排进行的,而是在分组间不停的跳跃,直到循环完成,对每一个分组都排好序。这实际上是找到各分组插排实现的共性,放到一起以简化代码【有点子各分组并行的意思】。def shellsort(arr): lenth = len(arr) gap = lenth // 2 while gap >= 1: for i in range(gap, lenth): j = i while j-gap >= 0 and arr[j] < arr[j-ga原创 2021-11-08 10:16:13 · 209 阅读 · 0 评论