
数据结构
浮汐
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
五大常用算法—动态规划详解和经典题目(python)
一、基本概念 把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解。 动态规划过程:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 假设问题是由交叠的子问题所构成,我们就能够用动态规划技术来解决它。一般来说,这种子问题出自对给定问题求解的递推关系中,这个递推关系包...原创 2020-03-13 16:25:39 · 3410 阅读 · 0 评论 -
数据结构-广度搜索BFS
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)示例 1:[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,...原创 2020-03-15 17:41:52 · 138 阅读 · 0 评论 -
数据结构-排序算法
#直接插入排序def insert(nums): for i in range(1,len(nums)): for j in range(i-1,-1,-1): if nums[j+1]<nums[j]: temp = nums[j] nums[j] = nums[j+1] ...原创 2020-03-11 10:37:40 · 120 阅读 · 0 评论 -
剑指Offer-字符串(字典)-第一个只出现一次的字符
50. 第一个只出现一次的字符在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。解题思路:用字典对每次出现的字符和出现次数进行存储输出对应次数的键代码实现:class Solution: def firstUniqChar(self, s: str) -> str: dic = {} for i in s: ...原创 2020-03-09 18:05:30 · 117 阅读 · 0 评论 -
剑指Offer-数组-滑动窗口的最大值
59 - I. 滑动窗口的最大值给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。解题思路:暴力解法:定义两个指针,每次输出两个指针内的窗口最大值代码实现:class Solution(object): def maxSlidingWindow(self, nums, k): #首指针为index0,尾指针为index0+k-1 ...原创 2020-03-09 17:05:37 · 256 阅读 · 0 评论 -
剑指Offer-二叉树-二叉搜索树的第k大节点
54. 二叉搜索树的第k大节点给定一棵二叉搜索树,请找出其中第k大的节点。解题思路:搜索二叉树的性质:左子树<根<右子树。搜索二叉树的中序遍历是顺序列表。输出中序遍历后,返回第k个数字。代码实现:...原创 2020-03-07 00:42:57 · 179 阅读 · 0 评论 -
剑指Offer-二叉树-二叉树中和为某一值的路径
34. 二叉树中和为某一值的路径输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22:返回:解题思路:DFS是深度的搜索,BFS是横向的搜索,参考打印二叉树剑指offer_32.从上到下打印二叉树使用 DFS 遍历整个树的过程中,保存好每一条路径的节...原创 2020-03-05 22:45:11 · 124 阅读 · 0 评论 -
剑指Offer-二叉树-二叉搜索树的后序遍历序列
33. 二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:解题思路:二叉搜索树是对一个有序数组进行二分查找形成的搜索树,它指一棵空树或者具有下列性质的二叉树。1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;2.若...原创 2020-03-05 17:21:14 · 165 阅读 · 0 评论 -
剑指Offer-二叉树-从上到下打印二叉树
32 - I. 从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7]:返回:解题思路:(BFS) O(n)O(n)我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左子树,再扩展右子树。所以在循环部分是:先扩展根节点;再依次扩展根节点的左右儿子,也就是从左到右扩展第二层...原创 2020-03-05 00:35:25 · 148 阅读 · 0 评论 -
剑指Offer-二叉树-对称的二叉树
含有两道题,都从树的递归入手27. 二叉树的镜像请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路:镜像翻转:只需要遍历二叉树,每次访问一个结点时,交换其左右子树。代码实现:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.v...原创 2020-03-04 17:34:49 · 113 阅读 · 0 评论 -
数据结构 - 队列和栈
栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于:stack:后进先出queue:先进先出对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1)。class Stack(object): def __init__(self): self.stack = [] ...原创 2020-03-04 12:09:56 · 138 阅读 · 0 评论 -
数据结构 -- 递归
递归的三大要素1.明确这个函数想要干什么例如,我定义了一个函数,想要算n的阶乘:// 算 n 的阶乘(假设n不为0)def f(n): return None 第二要素:寻找递归结束条件所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意...原创 2020-03-03 21:57:31 · 1524 阅读 · 0 评论 -
剑指Offer-二叉树-重建二叉树
07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路:前序遍历特点: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序,以题目示例为例:[ 3 | 9 | 20 15 7 ]中序遍历特点: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序,以题目示例为例:[ 9 | 3 | 15 20 7...原创 2020-03-03 00:31:45 · 113 阅读 · 0 评论 -
剑指Offer-链表-删除链表的节点
18. 删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点,返回删除后的链表的头节点。解题思路:删除值为 val 的节点可分为两步:定位节点、删除节点。定位值为 val 的节点: 遍历链表 head ,直到 head.val == val 时跳出,即可定位目标节点。删除链表中某节点: 设 cur 的上个节点为 pre ,下个节点为 cur.next ;则...原创 2020-03-01 18:28:57 · 135 阅读 · 0 评论 -
剑指Offer-链表-合并两个排序的链表
25. 合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。解题思路:每次获取 l1 指向的结点和 l2 指向的结点中值较小的结点。算法流程(迭代):定义头结点若 l1 指向的结点值 < l2指向的结点值,则将 l1 链接到头结点的 next 位置否则将 l2 链接到头结点的 next 位置循环进行,直至 l1 或 l2 为 N...原创 2020-03-01 15:48:09 · 99 阅读 · 0 评论 -
剑指Offer-链表-反转链表
24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。解题思路:链表特点:只能一个方向访问每个节点通过建立两个指针改变每个节点的指向算法流程:申请两个节点,pre和cur,pre最初指向None,cur指向head遍历每个节点,调整每个节点的指向并且pre和cur不断前进复杂度分析:空间复杂度:O(n)时间复杂度:O(1)代码实现...原创 2020-03-01 11:52:50 · 108 阅读 · 0 评论 -
剑指Offer-链表-链表中倒数第k个结点
06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。解题思路:链表特点:只能从前至后访问每个节点题目要求:倒序输出节点值算法流程:入栈:遍历链表,各节点入栈(python使用append方法)出栈:将各节点pop出栈,储存数值并返回。(python直接返回stack倒序列表)复杂度分析:复杂度分析:O(N)时间复杂度:O(N)...原创 2020-03-01 00:19:15 · 136 阅读 · 0 评论 -
剑指Offer-数组-旋转数组的最小数字
11.旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析:寻找旋转数组的最小数即寻找右侧排序的首元素。方法:二分查找1.取数组中间数,若中...原创 2020-02-27 11:05:15 · 131 阅读 · 0 评论 -
剑指Offer-数组-二维数组中的查找
04.二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:如果用暴力法遍历matrix,时间复杂度为O(m*n),通过引入标志数,可以降低时间复杂度。标志数:左下角和右上角有特殊性,使用其作为标志数左下角元素:所在列最大,所在行最小右上...原创 2020-02-26 11:37:55 · 107 阅读 · 0 评论 -
数据结构 - 二叉树
二叉树概念二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历。由于树的定义本身就是递归定义,因此採用递归的方法去实现树的三种遍历不仅easy理解并且代码非常简洁,而对于广度遍历来说,须要其他数据结构的支撑。比方堆了。所以。对于一段代码来说,可读性有时候要比...原创 2020-02-25 20:50:20 · 769 阅读 · 0 评论 -
数据结构与算法-字符串(Python)(五)
概述:字符串(string)简称串,也是一种线性结构。在python中和array差不多,因为py的数组也可以包括各种字符(在C/Java一类的语法中,数组必须是同一种数据类型的元素)。线性结构,有限序列,是主要特点。串其中可以包含各种元素,也是计算机主要处理的一类对象。因此,串的题目涉及的范围很广,可以结合其他算法出题,往往比较有难度。通常,动态规划,双指针,回溯和栈是很重要的工具。串的存储...原创 2020-02-16 00:13:47 · 310 阅读 · 0 评论 -
数据结构与算法-链表(Python)(四)
链表链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。特点:使用链表结构可以克...原创 2020-02-15 22:19:01 · 143 阅读 · 0 评论 -
数据结构与算法(Python)(三)
栈结构实现栈可以用顺序表实现,也可以用链表实现。栈的操作Stack() 创建一个新的空栈push(item) 添加一个新的元素item到栈顶pop() 弹出栈顶元素peek() 返回栈顶元素is_empty() 判断栈是否为空size() 返回栈的元素个数python的list来实现栈的操作class Stack(Object): '''栈''' def __init__(...原创 2020-02-15 20:55:35 · 186 阅读 · 0 评论 -
数据结构与算法(Python)(二)
顺序表在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。这样的一组序列元素的组织形式,我们可以将其抽象为线性表。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据...原创 2020-02-15 19:44:03 · 164 阅读 · 0 评论 -
数据结构与算法(Python)(一)
算法的提出算法的特性1.输入: 算法具有0个或多个输入2.输出: 算法至少有1个或多个输出3.有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个 步骤可以在可接受的时间内完成4.确定性:算法中的每一步都有确定的含义,不会出现二义性5.可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成算法效率衡量时间复杂度与“大O记法”我们假定计算...原创 2020-02-15 19:27:12 · 224 阅读 · 0 评论