算法与数据结构
算法与数据结构
BLUE_BULE
思路很简单,细节是魔鬼。
展开
-
二分查找说“简单”又“不简单”
二分查找也叫折半查找,学过的人都会说二分查找思路很简单,可以使用模板,是有规律可循的,事实确实是这样的,也就是所谓的“简单”;为什么又说二分查找“不简单”?二分查找“不简单”在查找的边界控制、循环控制,比如深入细节,比如while循环中条件是否应该带等号,mid 是否应该加一等等,这都需要去思考和测试才能找到答案,细节是魔鬼!1.二分查找算法为什么叫做二分查找?顾名思义需要“二分”,也就是将...原创 2020-04-05 14:28:31 · 274 阅读 · 0 评论 -
哈希表(Java)
哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希函数给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(...原创 2020-02-11 20:36:21 · 297 阅读 · 0 评论 -
LeetCode——387. 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = "leetcode"返回 0.s = "loveleetcode",返回 2.注意事项: 您可以假定该字符串只包含小写字母。Solution.javapublic class Solution { public int firstUniqC...原创 2020-02-11 10:28:00 · 87 阅读 · 0 评论 -
红黑树(Java)
红黑树红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。红黑树与2-3树在很大程度上是等...原创 2020-02-11 00:43:09 · 162 阅读 · 0 评论 -
AVL树(Java)
AVL树在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。特点1.本身首先是一棵二叉搜索树。2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)平衡因子...原创 2020-02-09 12:46:11 · 194 阅读 · 0 评论 -
并查集(Java)
并查集并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林(多棵树)来表示。UF.java(并查集接口)//并查集接口public interface...原创 2020-02-08 12:05:01 · 267 阅读 · 0 评论 -
LeetCode——677. 键值映射
677. 键值映射实现一个 MapSum 类里的两个方法,insert 和 sum。对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。示例 1:输入: insert(“apple”, 3), 输出: Null...原创 2020-02-07 12:02:43 · 208 阅读 · 0 评论 -
LeetCode——211. 添加与搜索单词 - 数据结构设计
211. 添加与搜索单词 - 数据结构设计设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord(“bad”)addWord(“dad”)addWord(“mad”)search(“pa...原创 2020-02-06 16:23:55 · 146 阅读 · 0 评论 -
LeetCode——208. 实现 Trie (前缀树)
208. 实现 Trie (前缀树)定义又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。例如:Trie存储的是单词,查询的时间复杂度是O(w),w为所查询单词的长度;如果...原创 2020-02-06 14:26:02 · 201 阅读 · 0 评论 -
线段树(Java)
线段树线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。这不是一棵完全二叉树,也不是满二叉树,是一棵平衡二叉树,如果将这棵树的最后一层不存在的节点定...原创 2020-02-05 14:10:03 · 697 阅读 · 0 评论 -
LeetCode——303. 区域和检索 - 数组不可变
303. 区域和检索 - 数组不可变给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> ...原创 2020-02-05 12:35:35 · 109 阅读 · 0 评论 -
LeetCode——347. 前 K 个高频元素
347. 前 K 个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ...原创 2020-02-02 13:50:20 · 256 阅读 · 1 评论 -
优先队列(Java)
优先队列(底层结构为最大堆)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。优先队列主要是出队操作与普通队列不同,队列中元素会有优先级之分,每次出队的元素是优先级最高的元素。最大堆最大堆...原创 2020-02-01 20:30:25 · 382 阅读 · 1 评论 -
LeetCode——350. 两个数组的交集 II
两个数组的交集 II给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。imp...原创 2020-01-28 20:54:51 · 86 阅读 · 0 评论 -
LeetCode——349. 两个数组的交集
两个数组的交集给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。import java.util.ArrayL...原创 2020-01-28 20:28:31 · 144 阅读 · 0 评论 -
LeetCode——804. 唯一摩尔斯密码词
唯一摩尔斯密码词国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: “a” 对应 “.-”, “b” 对应 “-…”, “c” 对应 “-.-.”, 等等。为了方便,所有26个英文字母对应摩尔斯密码表如下:[".-","-…","-.-.","-…",".","…-.","–.","…","…",".—","-.-",".-…","–","-.",...原创 2020-01-28 12:18:35 · 124 阅读 · 0 评论 -
二分搜索树及其遍历(Java)
二分搜索树二分搜索树是一颗二叉树二分搜索树每个节点的左子树的值都小于该节点的值,每个节点右子树的值都大于该节点的值任意一个节点的每棵子树都满足二分搜索树的定义二分搜索树是一种具备可比较性的树,左孩子 < 当前节点 < 右孩子。这种可比较性为我们提供了一种高效的查找数据的能力。BST.java(二分搜索树)//二分搜索树,不包含重复元素 //使用泛型,并要求该泛型必须...原创 2020-01-22 20:31:51 · 200 阅读 · 1 评论 -
LeetCode——203. 移除链表元素
移除链表元素删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5public class LinkedListDel { public class ListNode { // 节点类 int val; ListNode nex...原创 2020-01-21 12:06:20 · 310 阅读 · 0 评论 -
链表LinkedList实现队列(Java)
链表LinkedList实现队列Queue.java(队列接口)public interface Queue<E> { void enqueue(E e);//入队 E dequeue();//出队 E getFront();//获取队首元素 int getSize();//获取队列中元素个数 boolean isEmpty();//判断队列是否为空}Linke...原创 2020-01-20 12:25:29 · 869 阅读 · 0 评论 -
链表LinkedList实现栈(Java)
链表LinkedList实现栈LinkedList.java(链表)详细请看链表LinkedList(Java)public class LinkedList<E> { private class Node {// 内部类将节点设为私有 隐藏实现细节 public E e;// 元素 public Node next;// next指针 public Node(E ...原创 2020-01-20 12:11:34 · 379 阅读 · 0 评论 -
链表LinkedList(Java)
链表LinkedList定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。==链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。==由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度...原创 2020-01-19 18:17:01 · 259 阅读 · 0 评论 -
循环队列LoopQueue(Java)
循环队列LoopQueue为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种...原创 2020-01-18 14:01:14 · 733 阅读 · 0 评论 -
队列Queue(Java)
队列Queue队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是一种线性结构相比数组,队列相应的操作是数组的子集只能从队尾添加元素,只能从队首取出元素下述队列是以动态数组为底层实现动态数组动态数组及均摊复杂度与防止复...原创 2020-01-18 12:42:48 · 136 阅读 · 0 评论 -
动态数组实现栈(Java)
栈定义栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈是一种线性结构相比数组,栈对应的操作是数组的子集只能从一端添...原创 2020-01-15 15:58:33 · 258 阅读 · 0 评论 -
LeetCode——20. 有效的括号
有效的括号题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示...原创 2020-01-15 14:57:26 · 184 阅读 · 0 评论 -
动态数组及均摊复杂度与防止复杂度震荡(Java)
动态数组动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。//动态数组public class Arr<E> { private E[] data;// 创建一个数组 private int size;// 数组中元素个数 //自定义构造器初始化数组 cap...原创 2020-01-14 19:48:18 · 388 阅读 · 0 评论 -
C语言——查找算法的设计与应用(静态表折半查找,无序表中采用顺序查找)
二叉排序树设计设计一个读入一串整数,然后构造二叉排序树,进行查找。二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:1.若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值。2.若根结点的右子树非空,则右子树上所有结点的关键字值均大于等于根结点的关键字值。3.根结点的左、右子树也分别为二叉排序树。二叉排序树建立说明:当需要插入一个节点到二叉排序...原创 2019-12-11 19:05:15 · 1781 阅读 · 0 评论 -
C语言——图的操作与应用(邻接矩阵)
程序需求定义结点结构,定义图结构。存储图信息;写出判断是否为连通图的函数并定义求最小生成树的函数;写出主函数。算法的基本思想1.邻接矩阵图和树一样,没有顺序映像的存储结构,但可以借助数组的数据类型表示元素之间的关系。所以邻接矩阵是用于描述图中顶点之间关系(即弧或边的权)的矩阵。(1)图中无邻接到自身的弧,因此邻接矩阵主对角线为全零。(2) 无向图的邻接矩阵必然是对称矩阵。(...原创 2019-12-11 18:53:56 · 1292 阅读 · 0 评论 -
C语言——二叉树的基本操作(二叉树遍历)
程序需求1.内容包括二叉链表的结构描述。2.二叉树的建立。3.二叉树的先序、中序与后序遍历算法。先序遍历:先访问根节点,再先序遍历左子树,最后先序遍历右子树中序遍历:先中序遍历左子树,再访问根节点,最后中序遍历右子树后序遍历:先后序遍历左子树,再后序遍历右子树,最后访问根节点4.建立二叉树,并通过调用函数。5.输出先序遍历、中序遍历与后序遍历的结果。算法的基本思想根据题目要求,...原创 2019-12-11 18:44:51 · 4100 阅读 · 2 评论 -
C语言——线性表及其应用(栈和队列)
程序需求初始化顺序栈插入元素删除栈顶元素取栈顶元素遍历顺序栈置空顺序栈初始化并建立链队列入链队列出链队列遍历链队列算法的基本思想使用栈和队列的表示方式1.栈作为一种限定性线性表,将线性表的插入与删除操作限制为只在表的一端进行;使用顺序存储结构,利用一组地址连续的存储单元,设置栈顶指针Top来动态的指示栈顶元素在顺序栈中的位置,Top=-1表示空栈;2.队列只允许在表的...原创 2019-12-11 18:36:43 · 895 阅读 · 2 评论 -
C语言——线性表及其应用(单链表和顺序表)
程序要求1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。输入和输出的格式1.顺序线性表的建立、插入及删除顺序表#include<stdio.h>...原创 2019-12-11 17:17:33 · 6180 阅读 · 2 评论