
数据结构与算法
文章平均质量分 55
包括数据结构、排序、查找等算法实现,也包括Leecode等题目。
林子要加油
从事机器学习、NLP相关工作
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构:树
二叉树 1. 二叉树的基本概念 层数、高度、叶子结点、非叶子结点 下图中:二叉树一共有三层,第一层上的结点为1,第二层的结点有2个,分别为2、3,第三层的结点有2个:4和5。树的深度为最大层数,最大层数是3,所以树深为3. 二叉查找树(BST):二叉查找树的规则是,对于树中的任意一个结点,都满足,它的左孩子上的所有结点的值都比该结点小,而它的右孩子上的所有结点的值都比该结点大。与该结点值相同的的结点可以放在左孩子上,也可以放在右孩子上,这个可以根据实际情况灵活实现。 2. 二叉树的性质 二叉树第iii层原创 2021-01-03 20:03:17 · 185 阅读 · 0 评论 -
链表翻转
曾经在面试时候被问到单链表的翻转,今天又重新总结了一下。对于链表的遍历有两种,一种是线性的,比如for或while,另一种是非线性的,也就是递归。 对于翻转单链表的线性遍历有两种思路,一种是创建一个新链表,头结点插入法,另一种是就地反转法。前者理解相对容易一些,先说第一种方法,再说第二种。 单链表翻转 在重新说一下题目的定义: 定义一个链表的单结点: class ListNode: def __init__(self, x): self.value = x self.next = None 创原创 2021-01-02 14:33:50 · 268 阅读 · 1 评论 -
leetcode——integer break(343)
# -*- encoding: utf-8 -*- """ Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. Example 1: Input: 2 Output: 1 Explanation: 2 = 1 + 1, 1原创 2020-07-01 00:38:48 · 174 阅读 · 0 评论 -
leetcode统计记录
分类 题号 题目 难度 题目大意 解决思路 遍数 动态规划 70 Climbing Stairs easy 递归树/动态规划 1 链表 83 Remove Duplicates from Sorted List easy 一次遍历 current指针 1 链表 21 Merge tow sorted linked list easy 四个指针 1 数组 27 Remove elements easy 原位删除数组中指定的元素,并返回新数组的长度 双指针 1 数组 15 ...原创 2020-06-30 10:19:37 · 463 阅读 · 0 评论 -
leetcode——动态规划——70
最经典的爬台阶问题 递归树的思路: 红色的有重复计算,所以用空间换时间的思想来优化递归。 # -*- encoding: utf-8 -*- class Solution: """对于递归树来说,使用纯递归的方法,O(n)=2^n,有重复计算的情况""" def stairs_climbing(self, n: int) -> int: if n == 2: return 2 if n == 1: return 1 return s原创 2020-05-13 00:14:11 · 152 阅读 · 0 评论 -
leecode——remove duplicate elements(83)
def deleteDuplicates(head: ListNode) -> ListNode: if not head: return head dummy = ListNode(0) dummy.next = head cur = head.next while cur: if cur.val != head.v...原创 2020-04-12 23:21:45 · 211 阅读 · 0 评论 -
leecode——merge two sorted linked list(21)
做链表相关的题的工具类和方法: ListNode是链表的一个节点 array_to_list:把一个array转化为链表 print_list:打印一个链表 # -*- coding:utf-8 -*- class ListNode: def __init__(self, x): self.val = x self.next = None def a...原创 2020-04-12 23:20:09 · 116 阅读 · 0 评论 -
leecod的tags
可以按照这个tag来做,从easy到hard原创 2020-04-12 18:28:38 · 176 阅读 · 0 评论 -
leecode——remove element(27)
用两个指针来处理,存储的是删除后的index,另一个是遍历数组,如果数组中的值是要删除的值的话,就交换,这里自己和自己交换。 i = 0 for j in range(len(nums)): if nums[j] != val: # 如果第1个数就不是要删除的数的话,自己交换自己。 nums[i] = nums[j] i += 1 retu...原创 2020-03-29 01:37:15 · 155 阅读 · 0 评论 -
leecode——3sum(15)
三个数求和:找到和为0的三个数,并且结果中不能有相同的三个数据(虽然在nums是不同位置的数) 参考:https://leetcode.com/problems/3sum/discuss/232712/Best-Python-Solution-(Explained) 主要思路: (1)对数组排序,时间复杂度:O(NlogN)O(NlogN)O(NlogN) (2)遍历数组,先固定一个数,如果和上...原创 2020-03-29 00:13:46 · 110 阅读 · 0 评论 -
leecode——contianer with most water(11)
遇到这种题目不要慌张,根据要求,一步步的来思考。 from typing import List def max_area(height: List[int]) -> int: """ 暴力遍历,时间复杂度是O(n^2),本质上也是双指针,two pointers :param height: :return: """ max_a = 0...原创 2020-03-28 22:28:03 · 142 阅读 · 0 评论 -
数据结构(五)链表
真正的动态数据结构 最简单的动态数据结构 可以深入的理解引用 可以深入的理解递归 LinkedList实现 内部类Node,用于存放数据和next; LinkedList有一个Node类型的变量指向head。 在List头部添加元素 在List中间添加元素 删除List中指定位置的元素 修改List中指定位置的元素 查找指定位置的元素 注意:此处的List的实现都使用了虚拟头节点dumm...原创 2019-10-27 16:49:28 · 171 阅读 · 0 评论 -
数据结构(五)顺序结构实现有序线性表SortedList
有序线性表 SortedList package list; public interface SortedList { void insert(Object obj); Object delete(Object obj); int check(Object obj); } SequenceSortedList package list; /*...原创 2018-05-06 23:34:01 · 679 阅读 · 0 评论 -
数据结构(四)顺序结构实现线性表List
一、线性表的定义 线性表是具有相同类型数据的一个有限序列,数据与数据之间存在着线性关系。线性表中元素的个数称为线性表的长度。如果长度为0,则为空表。元素的序号是从1开始的。一般表示为: (a1,a2,a3,...,an)(a1,a2,a3,...,an)(a_1,a_2,a_3,...,a_n) 用二元组表示为: linear_list = (A,R) A={ai|1≤i≤n,n≥0}A...原创 2018-04-24 00:01:27 · 492 阅读 · 0 评论 -
数据结构(三)链接存储实现集合Set
一、链接存储 集合的顺序存储是通过数组实现的,而集合的链接存储是通过存储结点之间的链接实现的,链接形成的结果是一个链接表。构成链接表的每个结点由值域和指针域构成,值域存储数据,指针域是下一个结点的引用,以此来指向下一个结点。这样一个结点链接另一个结点构成的是一个单链表。第一结点称作表头结点,最后一个结点称作表尾结点。前面的结点称作前驱结点,指针指向的结点称作后继结点。 二、链表实现集合 ...原创 2018-04-21 19:24:40 · 710 阅读 · 1 评论 -
数据结构(二)顺序结构实现集合Set
一、集合的定义 集合是由相同类型的互不相同的数据元素聚焦而成,元素之前不存在任何逻辑关系。顺序结构就是使用数组,元素与元素顺序存储,但是元素之间没关系,也就是元素无论在哪个位置存储都是一样的。 a1,a2,a3,...,ana1,a2,a3,...,an { a_1,a_2,a_3,...,a_n } 二、集合的抽象数据类型 接口 Set定义了集合的操作 package set; ...原创 2018-04-21 10:39:10 · 546 阅读 · 0 评论 -
数据结构(一)基本概念
基本概念 数据结构包括数据的存储结构和数据的逻辑结构。 1. 数据的存储结构:顺序结构、链接结构、散列结构和索引结构。 2. 数据的逻辑结构:集合结构、线性结构、树型结构和图型结构。 3. B = (K,R) B代表一种数据结构,R是一种关系,K表示是元素的集合。 4. set、linearity、tree、graph set R为空时,元素之前没有任何关系 linearit...原创 2018-04-20 23:42:37 · 578 阅读 · 0 评论 -
leecode——two sum(1)
给定一个数组和一个目标值,在数组中找到两个数相加等于目标值。假设,数组中只有一对满足条件的数对。并返回这个数对的索引。 比如[3,3,4,1],target=6,数组中3和3相加为6, 所以返回[0,1] 难点:暴力循环容易解决,但是时间复杂度太高。 解决方法:空间换时间,用一个map把时间复杂度从O(n2)O(n^2)O(n2)减小到O(n)O(n)O(n)。 # -*- coding: utf...原创 2020-03-15 10:00:02 · 145 阅读 · 0 评论 -
leecode——remove duplicate in-place(26)
给定一个已经排好序的数组,原位去重,并返回去重后数组的长度。问题的要求是不能用数组的copy,也就是空间复杂度为O(1)O(1)O(1)。 比如:[0,0,1,1,2]原位去重后的数组的前3个数分别是0,1,2,返回的长度为3。 思路: 难点再于in-place,但是解题的出发点也在in-place,既然是原位。如上面的例子,一个长度是5的数组,去重的前三个位置放0,1,2,那么其它数去哪儿了,所...原创 2020-03-15 00:24:14 · 169 阅读 · 0 评论 -
三种O(n2)级别的排序算法:冒泡排序、选择排序及插入排序
三种简单的排序算法:时间复杂度为O(n2)O(n^2)O(n2)级别的,分别是冒泡排序、选择排序及插入排序。 工具类 package my.algorithm; public class Utils { // 生成一个长度为n的随机数组,范围是[rangeL, rangeR] // Math.random()生成一个(0,1)的数 public static int[]...原创 2019-09-28 00:54:51 · 903 阅读 · 0 评论