![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
wen-pan
是程序猿一只呀
展开
-
java实现环形数组
java实现环形数组。原创 2022-07-30 13:33:10 · 1215 阅读 · 0 评论 -
java数据结构与算法之二叉树的最大宽度和最大深度问题
①、最大深度问题求二叉树的最大深度,最常见的无非两种方式第一种是,以【宽度优先遍历】统计树的层数,树有多少层,那么树就有多高第二种是,以【深度优先遍历】,以我们上面讲的【二叉树通用套路】,每个节点都可以向他的左右孩子要信息来求解深度优先求树的最大高度解法/** * 以深度优先,求二叉树的高度 */public static int height(TreeNode treeNode) { if (treeNode == null) { return 0; }原创 2022-03-23 15:35:21 · 757 阅读 · 0 评论 -
java数据结构与算法之翻转二叉树
该题本来不是一个具有代表性的题目,但是由于在面试中我多次被问到该题,所以做一个记录。题目描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。解法一(DFS)/** * dfs法翻转二叉树(后序遍历) */public TreeNode invertTree1(TreeNode root) { if (root == null) { return null; } invertTree1(root.left); invertT原创 2022-03-22 11:42:34 · 1281 阅读 · 0 评论 -
java数据结构与算法之最长无重复子串问题
①、问题描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。力扣第三题该题主要考察了对string的基础API的熟悉度对hash表的熟练使用双指针 + 滑动窗口思想②、代码展示本题的核心就是使用hash表的去重功能public class NoRepeatSubString { /** * 双指针解法(滑动窗口思想) */ public int lengthOfLongestSubstring3(String s) {原创 2022-03-21 22:25:48 · 1028 阅读 · 0 评论 -
java数据结构与算法之最近公共祖先问题
①、问题描述给你两个节点node1,node2,这两个节点都在树上,再给你一个节点head,head表示二叉树的头节点,请返回他们【最近的公共祖先】②、核心点分析如果我们能顺着某个node向上找到他的父亲节点就好了。如果能从某个节点开始向上找到他的parent节点,那么这个题就和单链表相交问题一样了,变得非常简单了所以,对于这种二叉树结构,我们只要知道【二叉树的头节点】,那么我们就可以【遍历】这棵二叉树。然后利用【HashMap结构】来存放每个节点的父子关系,这样的话,对于每一个节点,我们都可以找原创 2022-03-21 20:34:49 · 707 阅读 · 0 评论 -
java数据结构与算法之使用两个栈实现队列
题目要求要求使用两个栈来实现一个队列的功能实现addLast功能实现pollFirst功能实现peekFirst功能实现isEmpty功能代码实现/** * 使用两个栈来实现队列 */class MyQueue<T> { private Stack<T> stack1; private Stack<T> stack2; public MyQueue() { stack1 = new Stack<&g原创 2022-03-21 19:00:48 · 895 阅读 · 0 评论 -
java数据结构与算法之两数之和于三数之和问题
①、题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。②、力扣相关题目力扣第653题力扣第1题③、解题1、暴力解法暴力解法最为简单,也最容易想到,但是时间复杂度为O(n^2)/** * 双重循环法 */public static int[] f1(int[] n原创 2022-03-21 12:12:00 · 392 阅读 · 0 评论 -
java数据结构与算法之求所有子数组问题
求数组子数组的题目是很多类似题目的基础,所以一定要明白如何求一个数组的【所有子数组】注意:这里讨论的是求数组的【所有子数组】和下面的求数组的【所有连续子数组】问题区分开①、题目描述给你一个整数数组nums,求该数组的所有子数组比如:nums = [1,2,3]返回,[ [1,2,3], [1,2], [1,3], [1], [2], [3], [2,3], [] ]②、类似题目力扣第2044题力扣第898题力扣第560题③、代码核心就是使用递归去做决策,对于数组中的每个位.原创 2022-03-18 16:11:15 · 2115 阅读 · 0 评论 -
java数据结构与算法之连续子数组问题
①、问题描述给定一个数组nums,0 < nums.length < 1000,请找出该数组的所有子数组并返回!!!什么是连续子数组呢?比如原数组 nums = [1, 2, 3] 那么他的连续子数组有[1,2,3]、[1,2]、[1]、[2]、[3]、[2,3][1,3]则不是他的连续子数组②、类似题目力扣898题力扣795题力扣560题③、代码// 测试代码public static void main(String[] args) { int[] int原创 2022-03-18 11:10:53 · 2618 阅读 · 0 评论 -
java数据结构与算法之全排列问题
①、问题描述给你一个字符串str,返回这个字符串的全部排列,比如:str = “abc”返回,[abc , acb, bac, bca,cab,cba]注意:如果字符串str里有重复字符呢?要求返回的全排列集合里不能存在重复字符串,比如:str = “aa”返回,[aa]。而不是[aa, aa]②、解题思路这种求全排列的问题,最常见也是最容易想到的写法就是【暴力递归】注意如果str里有重复字符,那么递归时需要做【剪枝】操作来保证结果集里不会有重复字符串对于递归算法主要是原创 2022-03-16 21:07:47 · 1340 阅读 · 0 评论 -
java单例模式常见的几种写法
单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全一、饿汉模式public class Singleton1 { /** * 饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化) */ private final static Singleton1 INSTANCE = new原创 2022-03-13 11:17:52 · 409 阅读 · 0 评论 -
java数据结构与算法之在有重复的有序数组中查找第一个等于target的索引下标
二分查找的题目,在面试中经常会被问到,但是仅仅只问二分法的话显得过于简单了很多面试官都会先给你一个【无重复值的有序数组】,然后叫你你写一个二分查找算法,看看你对二分查找是否熟悉如果你写出来了,然后继续问你,如果数组中有重复元素如何返回第一个和target相等的数的下标索引或最后一个和target相等的数的下标索引。并且要求你时间复杂度达到 O(logN)这题其实思路很简单,要求【时间复杂度达到 O(logN)】那就说明了必须是二分查找,关键在于一些边界条件的控制和自己的想法比如 力扣第34题p.原创 2022-03-11 22:59:12 · 931 阅读 · 0 评论 -
java贪心算法经典案例之项目利润最大问题
1、问题描述输入:正数数组costs正数数组profits正数k正数m含义:costs[i]表示i号项目的花费profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)k表示你只能串行的最多做k个项目m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目。输出:你最后获得的最大钱数。2、问题分析该问题很明显是一个贪心相关的问题,我们每次做项目的时候都选择项目成本在我的启动资金之内,并且利润最大的项目来做,这样是不是就做到了原创 2021-05-13 10:25:39 · 1398 阅读 · 0 评论 -
java数据结构与算法之判断是否是完全二叉树
一、完全二叉树简介一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。一言以蔽之,从左到右依次变满的二叉树就叫做完全二叉树。参考:[百度百科.完全二叉树定义](二、判断方法如果一棵二叉树满足同时满足如下①②条件,则这棵树就是完全二叉树!①、宽度优先遍历该树,遍历每个节点,任何一个节点如果有右孩子但没有左孩子,则直接返回false②、在 ① 的前提下,如果遇到原创 2021-05-12 11:26:48 · 1016 阅读 · 0 评论 -
java数据结构与算法之求树的最大宽度
一、分析要求一棵树的最大宽度,则我们需要知道每一层的最大宽度,然后才能找出最宽的那一层。由于需要知道每一层的宽度(该层的节点个数),所以需要一层一层的遍历二叉树,所以这正好符合树的宽度优先遍历。要知道每一层的宽度,其实就是统计每一层的节点个数。所以在遍历每一层的时候,需要知道当前节点所处的是哪一层,并且将该层的节点个数加一。当每一层遍历完后,需要将该层的节点个数与先前的层的节点个数最多的层做比较,取最大的那个值作为max。逐一遍历完每一层后,返回max即是最大值。二、代码实现/** *原创 2021-05-12 10:29:51 · 465 阅读 · 0 评论 -
java数据结构与算法之二叉树深度优先和广度优先遍历
宽度优先遍历算法流程:宽度优先遍历使用 队列,先进先出。先将头节点压入队列中,进入while循环每循环一次就从队列中弹出一个元素,弹出就打印。将该弹出元素的左右孩子节点压入队列中(如果有的话),先压左孩子,再压右孩子。重复上面第 2 、3 步骤,直到队列为空当遍历完整棵树以后就完成了树的宽度优先遍历/** * 二叉树宽度优先遍历 * 宽度优先用队列 */public static void widthPriority(final TreeNode head) { if (he原创 2021-05-11 22:42:48 · 355 阅读 · 0 评论 -
java数据结构与算法之判断是否是满二叉树
1、满二叉树的定义除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。参考:百度百科.满二叉树的定义2、根据满二叉树的定义,求解方法如下:求出节点个数 N 和树的最大深度 L通过公式:N = 2^L - 1 计算即可,如果等式成立,则说明是一棵满二叉树,否则就不是满二叉树。可以使用二叉树题目的套路来求解该题原创 2021-05-11 21:40:12 · 511 阅读 · 0 评论 -
java数据结构与算法之判断是否是二叉搜索树
一、什么是二叉搜索树一棵二叉树中,对于所有的子树,他的左边节点一定比他小,右边节点一定比他大。这样的树就叫做二叉搜索树。如何判断一棵树是否是二叉搜索树?方式一:直接通过树的中序遍历,搜索二叉树使用中序遍历出来的结果一定是升序的。方式二:可以根据二叉树的通用求解方法来求解。每个节点都可以向他的左右孩子要结果。一棵二叉搜索树的每个节点形成的子树都应该满足二叉搜索树的定义。所以我们对于每个子树都向他的左右孩子要结果,当所有的子树都是二叉搜索树时,整棵树就是二叉搜索树。二、解法方式一、通过中序遍原创 2021-05-11 18:34:57 · 543 阅读 · 0 评论 -
java数据结构与算法之链表相交问题
两个单向链表相交问题问题描述:有两个单向链表他们可能相交,也可能不相交。若相交则返回相交的节点,若不相交则返回null。两个单向链表相交,有且仅有三种情况。链表相交的问题算是链表问题中最难的问题之一了!!!!一、逐一分析三种情况【情况一】、两个无环链表方法一、通过hash表来做实现流程:先从头到尾遍历一条链表,在遍历的同时将节点放入到hash表中然后将第二条链表从头到尾开始遍历,遍历的同时首先查看hash表中有没有该节点如果有则证明在第一条链表中已经将该节点加入过了,说明该节点原创 2021-05-11 17:09:31 · 387 阅读 · 1 评论 -
java数据结构与算法之链表找环入口
java数据结构与算法之链表找环入口方法一:使用hash表的方式首先先遍历这个链表节点,遍历的同时将该节点放入到hashset集合中去。遍历每个节点的同时去set集合里看看该节点是否存在,如果存在则存在环,并且该节点就是环的入口节点。public static SingleNode hasCycle2(final SingleNode head) { if (head == null || head.next == null) { return null; } final H原创 2021-05-11 14:50:09 · 353 阅读 · 0 评论 -
java数据结构与算法之反转单链表
java数据结构与算法之反转单链表方式一、通过指针方式实现单链表反转具体步骤:需要用到三个指针(pre,current,next)分别指向当前节点的前一个节点,当前节点,当前节点的下一个节点首先current指针指向链表头节点pre指针指向nullnext指针指向null进入while循环然后将next指针指向current的下一个节点(临时保存下一个节点,以防止丢失下个节点)然后将pre指针指向current然后将next赋值给current重复上面从while循环开始步骤,直到原创 2021-05-11 11:01:43 · 205 阅读 · 1 评论 -
java数据结构与算法之二叉树遍历
一、递归实现二叉树前中后遍历递归实现二叉树遍历代码非常简单,主要是掌握好递归序,写好递归出口就可以了。1、递归实现二叉树先序遍历public static void preorderTraversal(final TreeNode head) { // basecase if (head == null) { return; } System.out.print(head.data + ","); preorderTraversal(head原创 2021-05-11 09:40:56 · 149 阅读 · 0 评论