数据结构和算法
数据结构和算法
不要停止思考-jcn
向往美好生活
展开
-
谈谈数据结构与算法【四】
常用数据结构与算法清单:数据结构:数组、栈、队列、链表、二分搜索树、集合、映射、堆、线段树、前缀树、并查集、平衡二叉树、2-3树、红黑树*、哈希表、图。*算法:选择排序、插入排序、冒泡排序、希尔排序、归并排序、快速排序(双路、三路)、堆排序、二分查找法、Prim算法、Prim算法、Dijkstra单源最短路径算法、Bellman-Ford算法。温馨提示:本文不对数据结构的底层具体实现以及在J...原创 2019-10-14 08:31:52 · 220 阅读 · 0 评论 -
谈谈数据结构与算法【三】
常用数据结构与算法清单:数据结构:数组、栈、队列、链表、二分搜索树、集合、映射、堆、线段树、前缀树、并查集、平衡二叉树、2-3树、红黑树*、哈希表、图。*算法:选择排序、插入排序、冒泡排序、希尔排序、归并排序、快速排序(双路、三路)、堆排序、二分查找法、Prim算法、Prim算法、Dijkstra单源最短路径算法、Bellman-Ford算法。温馨提示:本文不对数据结构的底层具体实现以及在J...原创 2019-10-14 08:31:02 · 174 阅读 · 0 评论 -
谈谈数据结构与算法【二】
常用数据结构与算法清单:数据结构:数组、栈、队列、链表、二分搜索树、集合、映射、堆、线段树、前缀树、并查集、平衡二叉树、2-3树、红黑树、哈希表、图。算法:选择排序、插入排序、冒泡排序、希尔排序、归并排序、快速排序(双路、三路)、堆排序、二分查找法、Prim算法、Prim算法、Dijkstra单源最短路径算法、Bellman-Ford算法。温馨提示:本文不对数据结构的底层具体实现以及在Jav...原创 2019-10-14 08:30:23 · 204 阅读 · 0 评论 -
谈谈数据结构与算法【一】
常用数据结构与算法清单:数据结构:数组、栈、队列、链表、二分搜索树、集合、映射、堆、线段树、前缀树、并查集、平衡二叉树、2-3树、红黑树、哈希表、图。算法:选择排序、插入排序、冒泡排序、希尔排序、归并排序、快速排序(双路、三路)、堆排序、二分查找法、Prim算法、Prim算法、Dijkstra单源最短路径算法、Bellman-Ford算法。温馨提示:本文不对数据结构的底层具体实现以及在Jav...原创 2019-10-14 08:29:31 · 163 阅读 · 0 评论 -
leetcode 3
题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 “...原创 2019-10-13 20:43:42 · 539 阅读 · 0 评论 -
leetcode 2
题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 ...原创 2019-10-13 20:43:06 · 179 阅读 · 0 评论 -
leetcode 1
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题思路:1.暴力解法(...原创 2019-10-13 20:42:30 · 70 阅读 · 0 评论 -
LeetCode Java数组387:字符串中的第一个唯一字符
题目描述:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。案例:s = "leetcode"返回 0.s = "loveleetcode",返回 2. 注意事项:您可以假定该字符串只包含小写字母。思路:将字符串存放在数组,遍历字符串字符求出字符出现频率,再判断频率值class Solution { public i...原创 2019-04-20 17:05:05 · 242 阅读 · 0 评论 -
LeetCode Java字典树677:键值映射
题目描述:实现一个 MapSum 类里的两个方法,insert 和 sum。对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。示例 1:输入: insert("apple", 3), 输出: Nu...原创 2019-04-18 15:40:03 · 279 阅读 · 0 评论 -
LeetCode Java 字典树Trie211: 添加与搜索单词 - 数据结构设计
题目描述:设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord("bad")addWord("dad")addWord("mad")search("pad") -> fa...原创 2019-04-18 12:49:39 · 233 阅读 · 0 评论 -
LeetCode Java前缀树Trie208:实现Trie(前缀树)
题目描述:实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWi...原创 2019-04-18 11:21:04 · 493 阅读 · 0 评论 -
LeetCode Java线段树307:区域和检索-数组可修改
题目描述:给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。示例:Given nums = [1, 3, 5]sumRange(0, 2) -> 9update(1, 2)sumRange(0, 2) ...原创 2019-04-17 22:42:53 · 257 阅读 · 0 评论 -
LeetCode Java线段树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) -> -3说明:...原创 2019-04-17 21:21:37 · 223 阅读 · 0 评论 -
LeetCode Java堆347:前K个高频元素
此题目类似于一个经典题:在1000000个元素中选取出前100名下面先对该经典题目做一下思路的分析,方便对LeetCode的题目做进一步的理解。在N个元素中选出前M个元素思路一、使用最小堆使用优先队列来维护当前看到的的前M个元素。对N个元素从头到尾扫描遍历一次,再将当前的前M个元素放入优先队列中,每次看到一个新的元素如果该元素比优先队列中最小的元素还要大时候,接着就把优先队...原创 2019-04-17 14:26:02 · 428 阅读 · 1 评论 -
LeetCode Java映射350:两个数组的交集||
给定两个数组,编写一个函数来计算它们的交集。示例 1: 示例 2:输入: nums1 = [1,2,2,1], nums2 = [2,2] 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [2...原创 2019-04-13 21:20:06 · 237 阅读 · 0 评论 -
LeetCode Java集合349:两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1: 示例 2:输入: nums1 = [1,2,2,1], nums2 = [2,2] 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4...原创 2019-04-13 16:55:53 · 324 阅读 · 0 评论 -
LeetCode Java集合804:唯一摩尔斯密码词
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串,比如:"a"对应".-","b"对应"-...","c"对应"-.-.", 等等。为了方便,所有26个英文字母对应摩尔斯密码表如下:[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","...原创 2019-04-13 12:25:02 · 243 阅读 · 0 评论 -
LeetCode Java链表203:移除链表元素
删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5提供的类:public class ListNode { int val; ListNode next; ListNode(int x) { ...原创 2019-04-12 21:05:04 · 186 阅读 · 0 评论 -
LeetCode Java栈20:有效的括号
给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1: 示例2: 示例3: 示例4: ...原创 2019-04-12 16:35:50 · 188 阅读 · 0 评论 -
LeetCode Java数组832:翻转图像
给定一个二进制矩阵A,我们想先水平翻转图像,然后反转图像并返回结果。水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转[1, 1, 0]的结果是[0, 1, 1]。反转图片的意思是图片中的0全部被1替换,1全部被0替换。例如,反转[0, 1, 1]的结果是[1, 0, 0]。示例 1:输入: [[1,1,0],[1,0,1],[0,0,...原创 2019-04-03 22:58:31 · 356 阅读 · 0 评论 -
LeetCode Java数组977:有序数组的平方
题目描述:给定一个按非递减顺序排序的整数数组A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 1: 示例 2:输入:[-4,-1,0,3,10] 输入:[-7,-3,2,3,11]输出:[0,1,9,16,10...原创 2019-04-03 13:47:03 · 312 阅读 · 0 评论 -
剑指offer(Java):从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路 1先对链表的进行反转,每次向数组添加反转后的第一个头元素,接着继续从头元素的下一个元素继续反转,以此类推,知道结束。package test;import java.util.ArrayList;public class Example { public ArrayList<In...原创 2019-04-09 23:42:10 · 1224 阅读 · 0 评论 -
剑指offer(Java):替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路很简单,从前往后遍历就对了。public class example { public String replaceSpace(StringBuffer str) { //1.定义一个StringBuff...原创 2019-04-09 16:50:02 · 160 阅读 · 0 评论 -
剑指offer(Java):二维数组中的查找
题目要求:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。根据题目要求二维数组为这样:0 1 2 7 8 1 3 5 7 9 5 6 7 8 9 8 8...原创 2019-04-08 12:36:59 · 105 阅读 · 0 评论 -
Java 哈希表的动态空间处理与复杂度分析
如果采用链地址法来存储元素的话,如果哈希表有M个地址,如果要想放入哈希表的元素为N。问题:那么此时每个地址就能存储M/N个元素。此时它们的哈希值是冲突的。如果每个地址都存储的是链表:O(N/M)如果每个地址是平衡树:O(log(N/M))怎么改进为O(1)呢?使用动态内存分配,内存谁着N的改变而自适应。和静态数组一样,固定地址空间是不合理的需要resize。解决思路...原创 2019-04-21 00:30:06 · 905 阅读 · 0 评论 -
Java 哈希表的实现
哈希表中泛型的键与红黑树中泛型的键本质是不一样的。由于实现的树是二分搜索树,所以要求键key必须具有可比较性。而对于哈希表是不需要这种性质的。对哈希表中键key必须有一个要求:必须实现hashCode方法。在Java中所有的类型的父类都是Object。而Object类中默认就有hashCode方法。所以所有类型默认都有实现hashCode的方法。利用TreeMap(底层为...原创 2019-04-20 21:56:50 · 4459 阅读 · 0 评论 -
Java 哈希冲突的处理
哈希冲突的处理:链地址法(Seperate Chaining)哈希表:生成的索引,可能是负整数,需要去掉符号“-”。和31个1进行按位与操作。接着按照索引位置存储进数组:如果再来个K3进行哈希转换成的索引还是1呢?依然放进1位置里面:此时的k2和k3就形成了链表的形式。查找表也可以使用平衡树结构:例如计算一个元素的哈希值所对应的索引,接着从哈希...原创 2019-04-20 21:13:42 · 1017 阅读 · 0 评论 -
Java 哈希表
一、哈希表基础:哈希函数:将字符类型转化为索引的函数。f(ch) = ch - 'a'转化为哈希函数之后就可以在哈希表中操作了。O(1)的查找操作。哈希冲突:解决哈希冲突:哈希表充分体现了算法设计领域的经典思想:空间换时间哈希表是时间和空间之间的平衡二、哈希函数的设计“键”通过哈希函数得到的“索引”分布越均匀越好。对于一些特殊的领域,有特...原创 2019-04-20 20:41:03 · 493 阅读 · 0 评论 -
Java 实现红黑树
红黑树的每个节点只能存放一个元素: 红黑树的红色节点都是左倾斜的。2-3树:此时的2-3树所对应的红黑树为:此时发现红黑树有三个红色节点,对应了2-3树的三个3节点,每个3节点对应的红黑树就会产生一个红节点。下面基于二分搜索树来实现红黑树:import java.uti...原创 2019-04-20 13:26:03 · 3978 阅读 · 1 评论 -
Java 利用2-3树理解红黑树
前一篇文章就描述的2-3树的结构特性和添加元素的操作:https://blog.csdn.net/qq_41723615/article/details/89408056下面利用2-3树来理解红黑树:一、颜色翻转和右旋转:红黑树添加新元素:(颜色翻转)flipColors1.首先向空的红黑树添加一个元素42,让它变为黑色。2.添加一个新的节点37,直接添加在左子...原创 2019-04-20 11:04:40 · 245 阅读 · 0 评论 -
Java 2-3树
2-3树满足二分搜索树的基本性质。节点可以存放一个元素或者两个元素。2-3树:每个节点有2个或者3个孩子,如果节点存放两个元素,左子节点的值小于b的值,中间节点的值在bc的范围之间,右子节点的值大于c的值。2-3树是一棵绝对平衡的树。2-3树添加元素不会添加到空的位置。比如有一棵树只有一个根节点42,想要插入一个37,由于42的子节点为空,且42所处的节点只有一个元素,所以...原创 2019-04-19 22:57:22 · 549 阅读 · 1 评论 -
Java 基于AVL树的集合和映射
基于AVL树的映射:AVLMappublic class AVLMap<K extends Comparable<K>, V> implements Map<K, V> { private AVLTree<K, V> avl; public AVLMap(){ avl = new AVLTree<...原创 2019-04-19 20:44:01 · 210 阅读 · 0 评论 -
Java 平衡二叉树:AVL
AVL是一种自平衡二分搜索树。满的二叉树:堆、线段树、AVL。AVL的定义:对于任意一个节点,左子树和右子树的高度差不能为超过1。平衡二叉树的高度和节点数量之间的关系也是O(logn)的。如果此时往5添加一个元素,4添加一个元素,此时的二叉树就不是平衡二叉树了。标注节点的高度,叶子节点的高度为1,如此添加标注。平衡因子:左子树的高度减去右子树的高度差。此...原创 2019-04-19 17:03:13 · 173 阅读 · 0 评论 -
Java 并查集Union Find
并查集:由孩子指向父亲的一种数据结构。该数据结构可以很高效的解决:连接问题(Connectivity Problem)例如:给出两个点,判断两个点是否可以通过路径连接起来。再如左上角的点与右下角的点是否是相连的?判断网络中节点间的连接状态。连接问题和路径问题:连接问题比路径问题要回答的问题少,因为连接问题只需要回答是否连接,而路径问题需要回答是否连接,路径是什么。这就表...原创 2019-04-19 10:48:58 · 458 阅读 · 0 评论 -
Java 前缀树Trie的实现
Trie的基础实现:本实现只适用于英语这么语言,将单词存放在Character对象中,所以Trie才没有使用泛型。使用泛型是比较好的设计:不过这里的应用场景为英语单词,所以这里不采用泛型。这里将单词看成字符串是由一个个Character组成的。1.向Trie添加元素(非递归写法)import java.util.TreeMap;public class Trie { ...原创 2019-04-18 13:08:19 · 838 阅读 · 0 评论 -
Java 前缀树Trie(字典树、单词查找树)
前缀树也称字典树、单词查找树。字典树是一种多叉树。之前我学习的映射,本身也可以称为字典,只不过和我们现在要说的字典树Trie不同。下面对映射字典和字典树Trie做性能比较: Trie的结构如图所示:Trie的定义:例如:每个节点有26个指向下个节点的指针。不过这里的26并不是一定的,如果字母有大小写,就要改成52,如果有加入其他特殊字符,又...原创 2019-04-18 10:00:40 · 931 阅读 · 0 评论 -
Java 线段树的实现及查询、更新操作
1.创建线段树运用递归逻辑实现线段树。对每个节点区间进行递归划分,直到区间的长度为1为止。public class SegmentTree<E> { private E[] tree; private E[] data; private Merger<E> merger; public SegmentTree(E[] arr, ...原创 2019-04-17 22:45:06 · 528 阅读 · 0 评论 -
Java 线段树Segment Tree
线段树也称为区间树。1.线段树介绍:对于有一类问题,我们关心的是线段(或者区间)。线段树的应用:1.最典型的线段树问题:区间染色:m次操作后,我们可以看见多少种颜色?m次操作后,我们可以在[i,j]区间内看见多少种颜色?有一面墙,长度为n,每次选择一段儿墙进行染色。之前被染色的部分,还能继续被下一次染色所覆盖。再两次覆盖:可以使用数组来解决从[i...原创 2019-04-17 16:09:24 · 658 阅读 · 0 评论 -
Java 使用最大堆实现优先队列
利用最大堆来实现一个优先队列,此处对堆的实现代码不做展示,想了解最大堆的实现可以阅读:https://blog.csdn.net/qq_41723615/article/details/89343314队列接口:public interface Queue<E> { int getSize(); boolean isEmpty(); void e...原创 2019-04-17 09:18:12 · 1383 阅读 · 0 评论 -
Java 最大堆
最大堆就是每个节点元素的值都要大于其子节点元素的值。底层利用数组来实现最大堆:1.最大堆的基本结构:public class MaxHeap<E extends Comparable<E>> { private Array<E> data; //动态数组:用户向堆存放元素 public MaxHeap(int cap...原创 2019-04-17 09:09:24 · 3540 阅读 · 0 评论