![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
AmorFati1996
这个作者很懒,什么都没留下…
展开
-
栈、队列、堆的java实现
一、栈 特点:先入后出(FILO)。 代码实现:Java官方建议使用Deque(双端队列)接口实现栈。不要使用Stack类(Vector类子类)实现,效率低。 Deque有两个常用实现类,分别为ArrayDeque(底层数组)和LinkedList(底层链表)。 至于在这两个中如何选择?我认为两者都有优劣。 LinkedList每次在插入或删除一个元素时都涉及到一个Node的创建和销毁,效率较低,并且LinkedList存储结构是不连续的,访问是不能很好的利用CPU缓存。可以插入null。 ArrayD原创 2020-12-29 10:13:20 · 669 阅读 · 3 评论 -
二叉树的遍历汇总
1. 给定一个二叉树的结构 //二叉树 public class BinaryTree { private BinaryTreeNode root; public BinaryTree(BinaryTreeNode root) { this.root = root; } public BinaryTree() { } } //树节点 public class BinaryTreeNode { private int val; p原创 2020-12-22 21:31:01 · 92 阅读 · 0 评论 -
动态规划(Dynamic Programming,DP)
核心思想 在解决一个棘手问题时,将问题分解成离散的子问题,通过先解决子问题,再逐步的解决大问题。 与分治算法的异同 相同点:两者的基本思想都是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 不同点:分治算法分解得到的子问题往往都是独立的,相互之间无关,如快速排序。而动态规划分解得到的子问题往往不是相互独立的,即下一个子问题求解往往是建立在对上一个子问题的求解的基础上进一步求解。 经典问题1——01背包问题 假如你是个小偷,背着一个可装4磅东西的背包,你可以盗窃的原创 2020-12-15 22:06:13 · 210 阅读 · 0 评论 -
贪心算法(贪婪算法,greedy algorithm)
核心思想 在对问题进行求解时,每步都选择局部最优解,希望最终可以得到全局最优解。 (贪心算法最终所得的结果不一定是全局最优解,但确是近似的最优解。) 经典问题——集合覆盖问题 有n个集合,每个集合都含有若干个元素,从中找出m个集合,要求包含n个集合中所有的元素且m最小。 一般解决方法: (1)列出n个集合的所有组合方案,因为每个集合都可以包含或不包含,所以共有2n2^n2n种组合方案。 (2)在这些组合方案中,找出含有所有元素的集合的组合,且组合中含有集合的个数最小。 该方法的时间复杂度为O(2n)O(2原创 2020-12-10 22:49:36 · 6151 阅读 · 0 评论 -
Java排序算法整理
1. 冒泡排序 public static void bubbleSort(int[] arr) { int temp; for (int i = 0; i < arr.length - 1; i++) { //优化:如果某次排序未发生位置交换,说明数组已有序。 boolean flag = true; for (int j = 0; j < arr.length - 1 - i; j++)原创 2020-11-30 15:52:09 · 82 阅读 · 0 评论 -
拼多多java面试题:找String对象子串问题
题目 给定一个字符串,要求找到满足如下条件的子串P。 1)P包含s中出现的所有字符。 2)P的字典序最小。 3)P的起始位置越靠后越好。 输入:dcdcaz 输出:cdcaz package org.example.exer; import java.util.HashMap; import java.util.Scanner; /** * @author AmorFati * @create 2020/10/25 22:38 */ public class StringExer {原创 2020-10-26 10:27:00 · 133 阅读 · 0 评论