随笔分类 -  数据结构和算法

摘要:经典题 爬楼梯: https://leetcode-cn.com/problems/climbing-stairs/ 硬币兑换: https://leetcode-cn.com/problems/coin-change/ 有效括号: https://leetcode-cn.com/problems/ 阅读全文
posted @ 2020-09-10 20:34 gaopengpy
摘要:二叉树的层序遍历: 这道题目的解决方案就是,根结点入队列,随后循环执行结点出队列并打印结果,左孩子入队列,右孩子入队列。直到队列为空。如下图所示: public static void levelTraverse(Node root) { LinkedList<Node> queue = new L 阅读全文
posted @ 2020-07-18 17:21 gaopengpy
摘要:二分查找代码模板: (right - left)>>1 相当于 (right - left)/2 右移运算符>>,运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。 public int findIndexOf(int[] nums, int target) 阅读全文
posted @ 2020-07-17 16:58 gaopengpy
摘要:深度优先遍历DFS用栈 递归写法: Set<Node> visited = new HashSet<>(); public void dfs(Node root, Set<Node> visited) { if (visited.contains(root)) {//terminator // al 阅读全文
posted @ 2020-07-17 16:48 gaopengpy
摘要:一、冒泡排序 public static void main(String[] args) { int[] arr = { 1, 0, 3, 4, 5, -6, 7, 8, 9, 10 }; System.out.println("原始数据: " + Arrays.toString(arr)); f 阅读全文
posted @ 2020-07-16 15:32 gaopengpy
摘要:BFS广度遍历代码模板 广度优先遍历用队列 /** 广度遍历代码模板 */ public class TestBFS { public List<List<Integer>> bsf(TreeNode root) { // 如果节点为空 if (root == null) { return null 阅读全文
posted @ 2020-07-13 17:55 gaopengpy
摘要:写递归最重要的是有终止条件,否则就会无限循环,代码模板如下: // Java public void recur(int level, int param) { // 递归的终止条件 if (level > MAX_LEVEL) { return; } // 处理当前层逻辑 process(leve 阅读全文
posted @ 2020-07-07 11:39 gaopengpy
摘要:二叉树的遍历方式有三种: 前序遍历: 先访问根节点,然后访问左子树,再访问右子树。 根节点->左节点->右节点 中序遍历: 先访问左子树,然后访问根节点,再访问右子树。 左节点->根节点->右节点 后序遍历: 先访问左子树,然后访问右子树,再访问根节点。 左节点->右节点->根节点 前序遍历是树根在 阅读全文
posted @ 2020-06-28 15:33 gaopengpy
摘要:查找链表中第k个节点,也是经常碰到的笔试题。 public class TestLinkedNode3 { public static void main(String[] args) { LinkedNode node1 = new LinkedNode(1); LinkedNode node2 阅读全文
posted @ 2020-02-15 10:51 gaopengpy
摘要://基于数组实现的顺序栈 public class ArrayStack { private String[] items; // 数组 private int count; // 栈中元素个数 private int n; // 栈的大小 // 初始化数组,申请一个大小为n的数组空间 public 阅读全文
posted @ 2020-02-12 18:16 gaopengpy
摘要:public class LinkedNode { Integer id; LinkedNode next; public LinkedNode(Integer id) { this.id = id; } // 打印链表 public void print(){ System.out.print(t 阅读全文
posted @ 2020-02-10 16:30 gaopengpy
摘要:public class LinkedNode { Integer id; LinkedNode next; public LinkedNode(Integer id) { this.id = id; } // 打印链表 public void print(){ System.out.print(t 阅读全文
posted @ 2020-02-09 23:29 gaopengpy
摘要:需要重点以下10种数据结构和10种算法: 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 阅读全文
posted @ 2020-02-08 12:42 gaopengpy
摘要:在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),哈希表是如何实现达到惊艳的常数阶O(1)的呢? 我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两 阅读全文
posted @ 2019-12-18 09:08 gaopengpy
摘要:HashMap默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为 阅读全文
posted @ 2019-12-17 10:48 gaopengpy
摘要:HashMap的实现原理 1.利用key的hashCode重新hash计算出当前对象的元素在数组中的下标。 2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中。 3.获取时,直接找到 阅读全文
posted @ 2019-12-04 11:21 gaopengpy
摘要:采用LinkedHashMap的按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部的原理,当数据量大于指定的缓存个数的时候,就自动删除最老的数据。 import java.util.LinkedHashMap; import java.util.Map; public class LRU 阅读全文
posted @ 2019-11-27 19:31 gaopengpy
摘要:HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 1、HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(H 阅读全文
posted @ 2019-11-27 09:22 gaopengpy
摘要:理想的状况,hashMap的存取就是O(1),也就是直接根据hashcode就可以找到它,每个bucket只存储一个节点,链表指向都是null,这样就比较开心了,不要出现一个链表很长的情况。 所以我们希望它能分布的均匀一点,如果让我们设计的话,我们肯定是直接对长度取模 hashcode % leng 阅读全文
posted @ 2019-11-24 17:46 gaopengpy
摘要:HashMap的存取过程,当执行putVal的操作的时候, 1.首先检查大小,看是否需要扩容(默认元素超过最大值的0.75时扩容),如果需要扩容就进行扩容 2.然后计算出key的hashcode,根据hashcode定位数值所在的bucketIndex 3.如果该位置上没有元素,就直接插入,结束 4 阅读全文
posted @ 2019-11-24 17:43 gaopengpy