数据结构笔记
文章平均质量分 70
tedist
这个作者很懒,什么都没留下…
展开
-
求第n个丑数
求第n个丑数题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数例如:前20个丑数为:1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36。方法一最容易想到的就是从1开始往上遍历各个整数,然后分别判断其是不是丑数,如果是的话数量加1,不是的话跳过。最后输出第N个丑数就行了。代码转载 2020-12-01 20:56:03 · 409 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路本体的难点在于特殊指针的复制,解决方法是先将每个原节点复制一遍放在对应原节点的后面,原节点之间的相对位置和新节点之间的相对位置是一致的,这样以来就能很容易的将特殊指针也复制到新节点上了。最后再将原链表拆分成一老一新两个链表。第一步:复制原节转载 2020-11-24 16:40:35 · 118 阅读 · 0 评论 -
剑指OFFER23-二叉树中和为某一值的路径
二叉树中和为某一值的路径输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:原创 2020-10-23 14:46:31 · 144 阅读 · 0 评论 -
剑指OFFER-21栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)使用辅助栈# -*- coding:utf-8 -*-class Solution: def IsPopOrder(self, pushV, popV): # write原创 2020-10-21 13:54:35 · 153 阅读 · 0 评论 -
剑指OFFER-10矩阵覆盖
剑指OFFER-10矩阵覆盖我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?这道题的要点就是对于题干的理解和转换,可以看到大矩形的行上的长度是固定的(2)唯一的变化在于列上的长度(n)而列上的填充方式:1.2 * 1的小矩阵竖着去覆盖(相当于前进一格) 2.2个2 * 1的小矩阵横着去覆盖(相当于前进两格)于是这个问题就转换成了青蛙跳格的问题了定义数组元素的含义:dp[i] 当n为i时的覆盖方法数组元素之间的关系式:dp原创 2020-09-24 12:57:45 · 118 阅读 · 0 评论 -
根据先历和中历结果构建二叉树
根据先历和中历结果构建二叉树例子:先历[1,2,3,4],中历[1,2,3,4]二叉树[1 # 2 # 3 # 4 #] def reConstructBinaryTree(self, pre, tin): # write code here head = TreeNode(pre[0]) if len(pre) == 1: return head temp = tin.index(pre[0]) if t原创 2020-09-22 19:18:59 · 116 阅读 · 0 评论 -
直接选择排序(python)
直接选择排序'''平均时间复杂度 O(n^2)最好情况时间复杂度 O(n^2)最坏情况时间复杂度 O(n^2)空间复杂度O(1)不稳定举个例子 (5) 4 3 [5] 1当1和(5)交换时,(5)和[5]之间的位置关系改变'''def straight_select(l): for j in range(len(l)): min = j for i in range(j+1,len(l)): if l[i] < l[原创 2020-09-19 12:21:15 · 257 阅读 · 0 评论 -
直接插入排序(python)
直接插入排序'''最好的情况O(n^2)最坏的情况O(n^2)平均情况O(n^2)'''def insert_sort(l): for i in range(1, len(l)): temp = l[i] j = i - 1 while l[j] > temp and j >= 0: l[j+1] = l[j] j -= 1 l[j+1] = temp...原创 2020-09-18 21:51:30 · 145 阅读 · 0 评论 -
堆排序(python)
堆排序def heap_adjust(heap,heap_size,p): largest = p left_child = 2*p + 1 right_child = 2*p + 2 if left_child < heap_size and heap[left_child] > heap[largest]: largest = left_child if right_child < heap_size and heap[righ原创 2020-09-18 13:58:01 · 128 阅读 · 0 评论 -
优化冒泡排序(python)
#优化冒泡排序(python)'''记录交换操作发生的位置,如果没有发生交换操作,则代表排序已经可以终止这样一来冒泡排序最好的情况下,时间复杂度就从O(n^2)优化到了O(n)'''def imroved_bubble_sort(l): length = len(l) swaplast = length - 1 for i in range(len(l)): sign = swaplast for j in range(swaplast):原创 2020-09-16 21:13:14 · 149 阅读 · 0 评论 -
快速排序(python)
#快速排序python实现参考:挖坑填数+分治法def quick_sort(l,left,right): tail = left head = right pivot = l[left] if left >= right: return while tail < head: while tail < head and l[head] >= pivot: head -= 1原创 2020-09-16 20:15:33 · 104 阅读 · 0 评论 -
二叉树结点深度(C语言)
在每个结点中储存其深度。在二叉树的创建和遍历过程中可以发现,每次调用函数的时候都是前往左子树或者右子树,这个时候所前往的结点的深度都会增加一个,而当函数调用完成的时候会退出函数栈在此函数中的结点深度就会减少一个。因此可以设置一个全局变量deep来表示当前函数中的结点的深度,在创建二叉树的函数开头深度加1,当函数调用结束退栈前再将深度减1.如下图所示的二叉树下面是代码#include<st...原创 2018-06-01 16:43:35 · 10983 阅读 · 0 评论 -
二叉树线索化及遍历(纯C语言)
最近在学习数据结构(c语言),严老师内容很详细,但书中的语言为类C语言。即使弄清楚了算法的理论但当我在实际编程中却发现需要根据c语言的语法修改一些。主要感觉就是书中引用的c++中的引用“&”。在C语言中我一般用函数返回值或者二重指针来进行替代。二叉树线索化及遍历中也运用了这些。分享出来希望能有所借鉴不足之处也希望指出。typedef enum pointertag{link,threa...原创 2018-04-09 17:16:35 · 2790 阅读 · 1 评论