
数据结构与算法
文章平均质量分 55
包括数据结构、排序、查找等算法实现,也包括Leecode等题目。
林子要加油
从事机器学习、NLP相关工作
展开
-
数据结构:树
二叉树1. 二叉树的基本概念层数、高度、叶子结点、非叶子结点下图中:二叉树一共有三层,第一层上的结点为1,第二层的结点有2个,分别为2、3,第三层的结点有2个:4和5。树的深度为最大层数,最大层数是3,所以树深为3.二叉查找树(BST):二叉查找树的规则是,对于树中的任意一个结点,都满足,它的左孩子上的所有结点的值都比该结点小,而它的右孩子上的所有结点的值都比该结点大。与该结点值相同的的结点可以放在左孩子上,也可以放在右孩子上,这个可以根据实际情况灵活实现。2. 二叉树的性质二叉树第iii层原创 2021-01-03 20:03:17 · 156 阅读 · 0 评论 -
链表翻转
曾经在面试时候被问到单链表的翻转,今天又重新总结了一下。对于链表的遍历有两种,一种是线性的,比如for或while,另一种是非线性的,也就是递归。对于翻转单链表的线性遍历有两种思路,一种是创建一个新链表,头结点插入法,另一种是就地反转法。前者理解相对容易一些,先说第一种方法,再说第二种。单链表翻转在重新说一下题目的定义:定义一个链表的单结点:class ListNode: def __init__(self, x): self.value = x self.next = None创原创 2021-01-02 14:33:50 · 250 阅读 · 1 评论 -
leetcode——integer break(343)
# -*- encoding: utf-8 -*-"""Given a positive integer n, break it into the sum ofat least two positive integers and maximize the product of those integers.Return the maximum product you can get.Example 1:Input: 2Output: 1Explanation: 2 = 1 + 1, 1原创 2020-07-01 00:38:48 · 150 阅读 · 0 评论 -
leetcode统计记录
分类题号题目难度题目大意解决思路遍数动态规划70Climbing Stairseasy递归树/动态规划1链表83Remove Duplicates from Sorted Listeasy一次遍历 current指针1链表21Merge tow sorted linked listeasy四个指针1数组27Remove elementseasy原位删除数组中指定的元素,并返回新数组的长度双指针1数组15...原创 2020-06-30 10:19:37 · 436 阅读 · 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 · 140 阅读 · 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 · 194 阅读 · 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 = Nonedef a...原创 2020-04-12 23:20:09 · 111 阅读 · 0 评论 -
leecod的tags
可以按照这个tag来做,从easy到hard原创 2020-04-12 18:28:38 · 162 阅读 · 0 评论 -
leecode——remove element(27)
用两个指针来处理,存储的是删除后的index,另一个是遍历数组,如果数组中的值是要删除的值的话,就交换,这里自己和自己交换。i = 0for j in range(len(nums)): if nums[j] != val: # 如果第1个数就不是要删除的数的话,自己交换自己。 nums[i] = nums[j] i += 1retu...原创 2020-03-29 01:37:15 · 141 阅读 · 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 · 102 阅读 · 0 评论 -
leecode——contianer with most water(11)
遇到这种题目不要慌张,根据要求,一步步的来思考。from typing import Listdef max_area(height: List[int]) -> int: """ 暴力遍历,时间复杂度是O(n^2),本质上也是双指针,two pointers :param height: :return: """ max_a = 0...原创 2020-03-28 22:28:03 · 130 阅读 · 0 评论 -
数据结构(五)链表
真正的动态数据结构最简单的动态数据结构可以深入的理解引用可以深入的理解递归LinkedList实现内部类Node,用于存放数据和next;LinkedList有一个Node类型的变量指向head。在List头部添加元素在List中间添加元素删除List中指定位置的元素修改List中指定位置的元素查找指定位置的元素注意:此处的List的实现都使用了虚拟头节点dumm...原创 2019-10-27 16:49:28 · 149 阅读 · 0 评论 -
数据结构(五)顺序结构实现有序线性表SortedList
有序线性表SortedListpackage list;public interface SortedList { void insert(Object obj); Object delete(Object obj); int check(Object obj);}SequenceSortedListpackage list;/*...原创 2018-05-06 23:34:01 · 658 阅读 · 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 · 479 阅读 · 0 评论 -
数据结构(三)链接存储实现集合Set
一、链接存储集合的顺序存储是通过数组实现的,而集合的链接存储是通过存储结点之间的链接实现的,链接形成的结果是一个链接表。构成链接表的每个结点由值域和指针域构成,值域存储数据,指针域是下一个结点的引用,以此来指向下一个结点。这样一个结点链接另一个结点构成的是一个单链表。第一结点称作表头结点,最后一个结点称作表尾结点。前面的结点称作前驱结点,指针指向的结点称作后继结点。二、链表实现集合...原创 2018-04-21 19:24:40 · 688 阅读 · 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 · 524 阅读 · 0 评论 -
数据结构(一)基本概念
基本概念数据结构包括数据的存储结构和数据的逻辑结构。1. 数据的存储结构:顺序结构、链接结构、散列结构和索引结构。2. 数据的逻辑结构:集合结构、线性结构、树型结构和图型结构。3. B = (K,R) B代表一种数据结构,R是一种关系,K表示是元素的集合。4. set、linearity、tree、graphset R为空时,元素之前没有任何关系linearit...原创 2018-04-20 23:42:37 · 561 阅读 · 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 · 132 阅读 · 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 · 161 阅读 · 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 · 883 阅读 · 0 评论