算法与数据结构
文章平均质量分 86
越来越胖的GuanRunwei
前WEB开发码农,.NET发烧友,前NLP菜鸡,利物浦大学在读博士
展开
-
详解经典例题——把数组排成最小的数(回溯算法并不是万能的)
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路1. 排列组合(回溯算法)2. 数字排序代码很遗憾,回溯思想的排列组合算法超时了,看来是我想的太多了import copyclass Solution: min_number_array = [] def PrintMinNumber(self, numbers):原创 2020-09-19 09:46:36 · 172 阅读 · 0 评论 -
二叉树递归经典例题——路径总和 II
题目给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2], ...原创 2020-09-18 19:45:21 · 214 阅读 · 0 评论 -
详解堆栈经典例题——栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路首先,特殊情况为两个序列中的至少一个为空或两个序列长度不相等,那么我们直接判定False。弹出序列顾名思义即为弹出元素的先后顺序,那么我们是否可以根据弹出序列结合压栈序列来模拟整个入栈出栈过原创 2020-09-14 16:47:21 · 2348 阅读 · 0 评论 -
详解搞怪数组经典例题——顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。题目如果看的稀里糊涂那就直接上图:题意也就是沿顺时针方向由外到内遍历二维数组,这是一道典型的数组内多指针问题。思路虽说是沿顺时针方向由外到内层层遍历,但每一层的遍历套路都是一样的。如上图所示每一层共分为4步,每1.原创 2020-09-14 16:28:08 · 177 阅读 · 0 评论 -
详解二叉树递归经典例题——二叉树的镜像
例题操作给定的二叉树,将其变换为源二叉树的镜像。输入描述二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路对我而言,第一眼看上去就像一道递归题。言归正传,所谓的镜像二叉树无非就是左右交换,你可以自顶向下地左右交换原创 2020-09-10 16:40:15 · 289 阅读 · 0 评论 -
详解二叉树递归经典例题——树的子结构
例题输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路基本思路要查找树A内是否包含树B,首先,先在树A中查找是否存在和树B根节点的值一样的结点R。若存在,则对比R的子树与B子树是否相同;若不存在,则在R的子树中继续寻找是否存在和树B根节点的值一样的结点R。如上图所示,首先我们在树A中找到跟树B值一样的节点:8,而后遍历两者子树,树A中节点8的左子节点为8,树B中节点8的左子节点为9,两个节点不同,判False。于是,遍历根节点8的左右子原创 2020-09-10 10:56:07 · 453 阅读 · 0 评论 -
两个栈实现队列
思路共有两个栈,分别为stack1和stack2。执行push操作,则元素node压入stack1。执行pop操作,若stack1中有多个元素,则依次将stack1中元素pop并压入stack2中,并pop。若执行pop操作时stack2中没有元素,则从stack1中pop后push进stack2,并将stack1清空(否则会造成冗余),而后pop stack2中的元素,若stack2中有元素则直接 pop stack2中的元素。代码class Solution: def __原创 2020-09-06 14:07:07 · 109 阅读 · 0 评论 -
一道水题:LeetCode(一和零)Python版
题目在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个0和 n 个1。另外,还有一个仅包含0和1字符串的数组。你的任务是使用给定的m 个0和 n 个1,找到能拼出存在于数组中的字符串的最大数量。每个0和1至多被使用一次。注意给定0和1的数量都不会超过100。给定字符串数组的长度不会超过600。示例 1输入: Array = {"10", "0001", "111001", "1", "0"}, m ...原创 2020-09-02 16:01:00 · 343 阅读 · 0 评论 -
Python标准库模块——heapq
概述heqpq模块提供了堆队列算法(也称为优先级队列算法)的实现。堆是二叉树,其每个父节点的值都小于或等于其任何子节点。此实现使用所有k的heap [k] <= heap [2 * k + 1]和heap [k] <= heap [2 * k + 2]的数组,从零开始计数元素。为了进行比较,不存在的元素被认为是无限的。堆的有趣特性是它的最小元素始终是根堆[0]。下面的API在两个方面与教科书堆算法不同:(a)我们使用基于零的索引。这使得节点的索引与其子节点的索引之间的关系不太明显,但翻译 2020-08-31 21:25:37 · 832 阅读 · 0 评论 -
一道水题:LeetCode(钥匙与房间)Python版
题目有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房原创 2020-08-31 21:10:59 · 447 阅读 · 0 评论 -
一道水题:LeetCode(重新安排行程)Python版
题目给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。提示如果存在多种有效的行程,请你按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前所有的机场都用三个大写字母表示(机场代码)。假定所有机票至少存在一种合理的行程。所有的机票必须都用一次原创 2020-08-31 09:45:57 · 246 阅读 · 0 评论 -
两种方法(滑动窗口, DP)解LeetCode水题:最长重复子数组
今天下午休息,闲来无事就随便刷刷LeetCode每日一题吧,结果推送给我的是一道难度中等的题,这是在侮辱我的智商吗?可后面的解题过程告诉我,我智商不用它来侮辱也是负数。话不多说,上题目。题目给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:1 <= len(A), len(B) <= 10000 &l...原创 2020-07-03 16:29:31 · 410 阅读 · 0 评论 -
傻子都能看懂的——递归和栈的关系
一个很简单的例子代码:public class 递归与栈 { public static void Recursion(int num) { if(num<1) return; System.out.println(num); //递 Recursion(num-1); System.out.println(num); //归 return; } p原创 2020-06-20 14:37:59 · 667 阅读 · 1 评论 -
傻子都能看懂的——Java中HashMap的底层实现原理
目录前言数组特点链表特点HashMap的put()和get()的实现1、map.put(k,v)实现原理2、map.get(k)实现原理3、为何随机增删、查询效率都很高的原因是?4、为什么放在hashMap集合key部分的元素需要重写equals方法?5、HashMap总结6、注意JDK8之后7、高频面试题前言HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一.转载 2020-06-19 21:57:26 · 943 阅读 · 0 评论 -
k-近邻算法入门代码
代码from numpy import *import operator# 构造四个点的坐标def createDataSet(): group = array([ [1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1] ]) labels = ['A', 'A', '...原创 2020-04-13 15:45:14 · 191 阅读 · 0 评论 -
Python实现二叉排序树的搜索、插入、删除
代码:import sysimport gcsys.path.append("F:\Workspace")from Algorithm.TreeNode import TreeNodedef SearchBST(t: TreeNode, key: int)->bool: if t is None: return False if key =...原创 2020-04-11 16:59:25 · 717 阅读 · 0 评论 -
Python实现斐波那契查找
思路:自己去看网上的概念贴代码:def fibonacci_sequence(num: int): # 按照待查找数列的大小,动态生成斐波那契数列 a, b = 0, 1 while a <= num-1: yield a a, b = b, a + b yield a returndef fibonacc...原创 2020-04-09 11:05:48 · 576 阅读 · 0 评论 -
Python实现:现在有一个随机数生成器, 1/3概率生成1, 2/3生成0, 如何基于这个生成器, 得出一个1/2概率是0, 1/2概率是1的生成器?
今天看到一道字节跳动后台开发岗的面试题,题目如下:现在有一个随机数生成器, 1/3概率生成1, 2/3生成0, 如何基于这个生成器, 得出一个1/2概率是0, 1/2概率是1的生成器?思路:可以将结果看过一个二元组,那么有4种情况分别是(0,0),(0,1), (1,0),(1,1)其中 p((0,0)) = 4/9 p((1,1)) = 1/9 ...原创 2020-03-29 13:36:38 · 2636 阅读 · 1 评论 -
树、森林和二叉树的转换
树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。(3)层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子)森林转换为二叉树(1)把每棵树...原创 2020-02-14 11:29:03 · 123 阅读 · 0 评论 -
为什么先序遍历和后序遍历不能确定唯一的二叉树?
前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。由二叉树的中序和前序遍历序列可以唯一确定一棵二叉树 ,由前序和后序遍历则不能唯一确定一棵二叉树。由二叉树的中序和后序遍历序列可以唯一确定一棵二叉树,由前序和后序遍历则不能唯一确定一棵二叉树。先序遍历,按照最优先顺序沿一定路径经过路径上所有的站。在二叉树中...原创 2020-02-14 10:54:13 · 6457 阅读 · 0 评论 -
五分钟搞懂什么是B-树(全程图解)
前戏我们大家都知道动态查找树能够提高查找效率,比如:二叉查找树,平衡二叉查找树,红黑树。他们查找效率的时间复杂度O(log2n),跟树的深度有关系,那么怎么样才能提高效率呢?当然最快捷的方式就是减少树的深度了。那么怎么减少树的深度呢?为了解答这个问题,我们慢慢来看,先看个实际问题吧。问题背景在大型的数据库存储中,实现索引查找,如果采用二叉查找树的查找的话,由于节点的存储数据是有限的(不...转载 2020-02-14 09:59:25 · 383 阅读 · 0 评论 -
详解AVL树
https://blog.csdn.net/qq_25343557/article/details/89110319转载 2020-02-13 21:56:55 · 1082 阅读 · 0 评论 -
一道水题: LeetCode(下一个排列) Java版
题目:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1来源:力扣(LeetCode)链接:ht...原创 2019-12-24 21:34:11 · 164 阅读 · 0 评论 -
一道水题: LeetCode(二叉树展开为链表) Java版
题目:给定一个二叉树,原地将它展开为链表。例如,给定二叉树 1 / \ 2 5/ \ \3 4 6将其展开为:1\ 2 \ 3 \ 4 \ 5 \ 6来源:力扣(LeetCode)链接:https://leetcode-cn....原创 2019-12-23 19:27:35 · 176 阅读 · 0 评论 -
一道水题: LeetCode(从中序与后序遍历序列构造二叉树) Python版
题目:根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder =[9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetc...原创 2019-11-16 16:11:43 · 324 阅读 · 0 评论 -
一道水题: LeetCode(从前序与中序遍历序列构造二叉树) Python版
题目:根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder =[3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetco...原创 2019-11-15 22:18:46 · 161 阅读 · 0 评论 -
一道水题: LeetCode(两数相除) Python版
题目:给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数dividend除以除数divisor得到的商。示例1:输入: dividend = 10, divisor = 3输出: 3示例2:输入: dividend = 7, divisor = -3输出: -2说明:被除数和除数...原创 2019-11-14 21:55:27 · 198 阅读 · 0 评论 -
一道水题:LeetCode(括号生成 之 比较简单的写法)Java版
题目:给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ]思路:解题思路:我们认为一...原创 2019-10-30 19:32:19 · 162 阅读 · 0 评论 -
一道水题:LeetCode(二叉树的最大深度 之一行写法)Java版
题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。来源:力扣(LeetCode)链接:https://leetcode-...原创 2019-10-30 19:27:12 · 164 阅读 · 0 评论 -
一道水题:LeetCode(合并K个排序链表之最鲨雕写法)Java版
我:爷爷,我想用递归写这道题。爷爷给了我最爱吃的大嘴巴子题目:合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:htt...原创 2019-10-30 19:24:28 · 129 阅读 · 1 评论 -
一道水题:LeetCode(全排列)Java版
题目:给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations著作权归领扣网络所有。...原创 2019-10-25 11:53:01 · 179 阅读 · 0 评论 -
没事干系列:二叉树的BFS(广度优先遍历)和DFS(深度优先遍历)队列和栈实现(Java)
二叉树:BFS:利用队列实现:A进队列,A弹出;BC进队列,B弹出,DE进队列;C弹出,FG进队列;D弹出;E弹出,HI进队列;F弹出;G弹出。代码:import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class 二叉树的广度遍历 { sta...原创 2019-10-16 14:37:24 · 401 阅读 · 0 评论 -
一道水题:LeetCode(最大子序和)C#版
题目:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。来源:力扣(LeetCode)链接:https://l...原创 2019-07-12 19:29:46 · 228 阅读 · 0 评论 -
记如何解决蓝桥杯中to_string和atoi等无法使用的问题
转自:https://www.cnblogs.com/A-Little-Nut/p/10311316.htmlCode:#include<iostream>#include<sstream>using namespace std;int main(){ // int 转 string int number = 12; string str; ...转载 2019-03-21 10:15:55 · 737 阅读 · 0 评论 -
精确总结——01背包问题 (动态规划算法)
转自:原文:https://blog.csdn.net/xp731574722/article/details/70766804迄今为止看到的最通俗易懂的解释,没有之一————————————————————————————————————————————0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。问:应该如何选择装入背...原创 2019-03-19 20:04:21 · 14115 阅读 · 0 评论 -
算法训练:素因子去重 &C++ set特性与用途
上一次写C++不知道是什么时候了,贴一道水题,顺便讲讲这个set ……Question:问题描述 给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1输入格式 一个整数,表示n输出格式 输出一行,包含一个整数p。样例输入1000样例输出10数据规模和约定 n<=10^12 样例解释:n=1000=2^3*5*3,...原创 2019-02-05 20:24:42 · 470 阅读 · 0 评论 -
程序猿攻城狮必须要掌握的十大经典算法
算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一...转载 2019-01-23 20:56:12 · 193 阅读 · 1 评论 -
分治法之归并排序
分治法,顾名思义,将一个大问题分解成多个小问题,各个击破,这些小问题互相独立并且与原问题相同。分治法分为3步:1、分,即分解问题,将问题分解为多个子问题2、治,递归地求解各个子问题(若子问题足够小,可直接求解)。3、合并,将子问题的解合并成原问题的解。归并排序链接Finish...转载 2018-10-12 19:27:58 · 233 阅读 · 0 评论 -
就 几种排序
(1)冒泡排序冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。(2)选择排序选择排序是给每个位置选择当前...原创 2018-05-12 17:57:18 · 183 阅读 · 0 评论 -
一道水题_黑色星期五
问题描述 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。 说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是...原创 2018-03-25 15:39:58 · 664 阅读 · 0 评论