数据结构与算法
数据结构与算法
aaronthon
这个作者很懒,什么都没留下…
展开
-
算法:由外向内顺时针打印矩阵(n*n)元素
输入一个矩阵(n*n),按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]限制:0 <= matrix.length0 <= matrix[i].lengthimport copyclass Solution(object...原创 2020-06-08 11:43:00 · 388 阅读 · 0 评论 -
求列表最长子序列
def ma(li): if not li: return li n = len(li) m = [] for i in range(n-1): nn = 0 for j in range(i+1, n-1): if li[i] < li[j]: ...原创 2020-09-24 11:02:00 · 108 阅读 · 0 评论 -
单链表反转
# coding: utf-8class Node(object): def __init__(self, data, next=None): self.data = data self.next = nextdef reverserNode(head): if head == Node or head.next == Non...原创 2020-09-10 19:39:00 · 68 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最...原创 2020-10-14 20:15:00 · 63 阅读 · 0 评论 -
把数组排成最小数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解答第一步,递归,找出所有的组合结果;第二部,找出最小组合的值。# coding:utf-8class Solution: def Permutation(self, number...原创 2020-10-15 13:54:00 · 99 阅读 · 0 评论 -
最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解答先排序,再返回最小的k个数# coding:utf-8class Solution: def GetLeastNumbers_Solution(self, tinput, k): # write code here ...原创 2020-10-14 15:52:00 · 81 阅读 · 0 评论 -
丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解答丑数的正整数集合,比如2,3,5,2*2,2*3,2*5,3*5,2*2*2.。。。# coding:utf-8class Solution: def GetUglyNum...原创 2020-10-16 19:57:00 · 79 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。解答二叉搜索树的两个特征:1,二叉搜索树的左子树的值都小于根节点的值。2,二叉搜索树的右子树的值都大于根节点的值。后续遍历的根节点都是在最后面,所以先根据后续遍历的结构找到二叉搜索树的根和左、右子树,让后使用递归。#...原创 2020-10-10 17:16:00 · 82 阅读 · 0 评论 -
包含main函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解答方法一:两个栈实现# coding:utf-8class Solution: def __init__(self): self.a = [] self.b = [] def push(self, node): ...原创 2020-10-09 19:59:00 · 213 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解答# coding:utf-8class Solution: ...原创 2020-10-09 20:30:00 · 139 阅读 · 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.解答# coding:utf-8class Solution: # matrix类型为二...原创 2020-10-09 17:28:00 · 86 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法解答归纳法:共有2的n-1次放种跳法。# -*- coding:utf-8 -*-class Solution: def jumpFloorII(self, number): # write code here if n...原创 2020-09-25 15:31:00 · 60 阅读 · 0 评论 -
跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解答本质就是斐波那契数列# coding:utf-8class Solution: def jumpFloor(self, number): # write code here if number == 0:...原创 2020-09-25 15:13:00 · 69 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解答方法一:先将链表反转,再正序输出第k哥节点。如下:# coding:utf-8class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: def FindKt...原创 2020-09-27 17:14:00 · 81 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0解答# coding:utf-8class Solution: def Power(self, base, exponent): # write code here tem...原创 2020-09-27 14:46:00 · 62 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解答二叉搜索树的特点,左子树的节点值都小于根节点值,右子树的节点值都大于根节点值。先使用中序遍历方式,将二叉搜索树的节点按值的升序方式放到一个列表内。然后给列表内的节点设置指针。# coding:utf-8class TreeNode: d...原创 2020-10-13 21:10:00 · 94 阅读 · 0 评论 -
原码、反码与补码
1. 原码原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:[+1]原= 0000 0001[-1]原= 1000 0001第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]原码是人脑最容易理解和计算的表示方式.2. ...原创 2020-09-27 14:22:00 · 146 阅读 · 2 评论 -
复杂链表的赋值
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解答创建一个列表l1,将链表的每一个节点按顺序加到列表l1里面。创建一个字典d1,以链表的节点和当前节点的random指针指向的节点分别作...原创 2020-10-13 20:19:00 · 146 阅读 · 0 评论 -
矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:解答:本质是递归:# coding:utf-8class Solution: def jumpFloor(self, number): # write code here ...原创 2020-09-27 10:14:00 · 66 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解答先判断A、B是否为空,有一个为空,就返回False(ps:我们约定空树不是任意一个树的子结构)。在A、B都不为空的情况下:1、判断B的根是否在A里面,如果A的根等于B的跟,那么分别在A的左右孩子里面找等于B的根的节点。2,在A的节点内,没有找到等于B的根的节点,返回Fals...原创 2020-09-28 17:43:00 · 96 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解答递归法# coding:utf-8class Solution: # 返回二维列表,内部每个列表表示找到的路径 def FindPath(self, root, expectNumber):...原创 2020-10-12 20:09:00 · 78 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解答# coding:utf-8# 创建结点class ListNode: def __init__(self,x, next=None): self.val = x self.next = next# 合并链表class Sol...原创 2020-09-28 15:05:00 · 70 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 ...原创 2020-09-28 20:11:00 · 97 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。解答# coding:utf-8class Solution: def NumberOf1(self, n): if n < 0: # 当n是负数,通过& 0xffffffff求得负数的补码 n = n & 0xffffff...原创 2020-09-27 14:18:00 · 64 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解答哈希法# coding:utf-8class Solution: def MoreThanHalfNum_Solution(self, numbe...原创 2020-10-14 15:36:00 · 62 阅读 · 0 评论 -
字符串的排序
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解答递归# coding:utf-8class Solution: def Permutat...原创 2020-10-14 15:18:00 · 882 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解答使用两个栈,一个存放节点值,一个存放节点。# coding:utf-8class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Nonec...原创 2020-10-10 09:37:00 · 59 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解答前序打印先打父节点,再打左节点、最后打右节点,所有第一个元素肯定是根节点。中序打印,先打左节点,再打父节点,最后打右节点,所有根据前...原创 2020-09-24 21:10:00 · 72 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解答1,循环每一行,先判断当前行的最后一个元素与target是否相等,相等则return。2,如果当前行最后一个元素大于target,则按照倒叙方式将target与当前行的元素比较...原创 2020-09-24 11:16:00 · 101 阅读 · 0 评论 -
二叉树
一、二叉树二叉树是一种特殊的树,其特点如下:二叉树每个节点最大只能有两个节点。二叉树的子树也就是节点有左右之分,即左节点和右节点,次序不能乱。二叉树即使只有一个子树,也有左右之分。二、满二叉树一种特殊的二叉树,其所有的分支节点都有两棵树,其所有的叶子节点都在同一层内。所有的叶子节点都在同一层。所有的非叶子节点都有两棵树,即节点度都是2.同样深度的二叉树中,满二叉树...原创 2020-09-12 21:41:00 · 136 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解答第一个栈用来进行入栈操作。第二个栈进行出栈操作。当第二个栈为空时,将第一个栈的元素全部倒序加到第二个栈里面。# coding:utf-8class Solution: def __init__(self): self.l1 = [] ...原创 2020-09-25 10:09:00 · 70 阅读 · 0 评论 -
双链表结构
双链表结构比单链表结构更有优越性。它允许用户做如下的事情:从给定的节点,向左移动到前一个节点。直接移动到最后一个节点。双链表结构的节点类的python实现,通过给provious指针添加一个字段,扩展了前面所讨论的Node类。如下是两个类的代码:# coding: utf-8class Node(object): def __init__(self, data,...原创 2020-09-08 14:28:00 · 523 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39解答# coding:utf-8class Solution: def Fibonacci(self, n): # write code here a = 0 b = 1 ...原创 2020-09-25 14:25:00 · 63 阅读 · 0 评论 -
栈(stack)
栈是线性的集合,其中,访问都严格地限制在一端,也叫做顶(top)。栈地=的一个经典的类比,就是每个每个餐馆都能看到摞起来的干净餐盘。当需要用一个餐盘的时候,从一摞餐盘的顶部去走一个,当任何洗干净的餐盘放回到厨房的时候,他们也都是放在一摞的顶部。没有人会专门从中间抽取一个很好的餐盘,靠近底部的餐盘甚至可能根本不会用到。我们说,栈遵从后进先出(last-in first-out,LIFO)的...原创 2020-09-08 15:52:00 · 106 阅读 · 0 评论 -
旋转数组的最小数字-顺序查找
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解答如果数组第一个数比最后一个数小,则表示该数组没有进行旋转,是有序的,第一个元素就是最小的。如...原创 2020-09-25 13:26:00 · 83 阅读 · 0 评论 -
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)...原创 2020-09-12 00:12:00 · 78 阅读 · 0 评论 -
栈接口
栈并不是python的内建类型。python程序员在必要的时候可以使用python列表来模拟基于数组的栈。如果你将列表的末尾看作是栈的顶,列表方法append就是将元素压入到栈中,而列表方法pop会删除并返回栈顶的元素。这种选择的主要缺点是,所有其他的列表操作都可以操作这个栈。这写额外的操作都违反了栈作为一种抽象数据类型的本意。除push和pop操作外,栈接口还提供了一个名为peek的...原创 2020-09-08 17:44:00 · 373 阅读 · 0 评论 -
栈的应用之迷宫问题
给一个二维数组列表,表示迷宫。0表示通道,1表示围墙。给出算法,求一条走出迷宫的路径。如下图:代码如下:# coding: utf-8# 迷宫问题使用栈来实现# 定义迷宫 1:表示墙 0:表示路maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 0, 0, 0, 1, 0, 1], [1, ...原创 2020-09-11 22:51:00 · 341 阅读 · 0 评论 -
循环链表结构
在单链表结构上,在第1个节点插入和删除,只不过是第i个节点的插入和删除的特殊情况。这些情况只所以特殊,是因为head指针必须重置。可以使用一个带有哑头节点循环链表结构来简化这些操作。循环链表结构包含了从结构中的最后一个节点返回到第一个节点的链接。在这个实现中,至少总是有一个节点。这个节点也就是哑头节点(dummy header node),它不包含数据,但是充当了链表结构的开头和结尾的一...原创 2020-09-07 17:49:00 · 540 阅读 · 0 评论 -
单链表操作之替换
在单链表结构中的替换也利用了遍历模式。这种情况下,我们在链表结构中搜索一个给定项或一个给定位置,并且用新的项替换该项。第一个操作,即替换一个给定的项,并不需要假定目标项在链表结构中。如果目标项不存在,那就不会发生替换,并且该操作返回False。如果目标项存在,新的项会替换它,并且该操作返回True。代码如下:# coding: utf-8class Node(object): ...原创 2020-09-04 19:34:00 · 1163 阅读 · 0 评论