数据结构
数据结构
jay编程
这个作者很懒,什么都没留下…
展开
-
01背包问题使用递归和非递归
标题:01背包问题使用递归和非递归见视频:添加链接描述F(k,w),k:前几件物品可以偷,w,当前背包容量package com.suanfa;import javafx.beans.WeakInvalidationListener;import java.util.Arrays;/**01背包问题 01背包问题:https://www.bilibili.com/video/BV1g7411B7SP?spm_id_from=333.999.0.0 **/public class原创 2022-03-06 18:09:28 · 305 阅读 · 0 评论 -
Java中优先队列,大根堆,小根堆
标题:Java中优先队列,大根堆,小根堆小根堆,得到最大的前k个,1。在一堆元素中,先放入k个,【堆顶元素最小,内部实现的】,2。然后放入第k+1个元素时,与堆顶元素比较,3.若大于堆顶元素,则放入堆中,【<=则不理会】调整堆,以此下去,所以最后小根堆中的元素是最大的前k个 //2.java中优先队列 public void TestPriorityQueue(){ PriorityQueue<Integer> q = new PriorityQueue&原创 2022-03-04 10:39:52 · 1232 阅读 · 0 评论 -
Java实现二叉搜索树的最近祖先节点
标题:Java实现二叉搜索树的最近祖先节点一、题解1) 方法一:得到两个list执行用时:8 ms, 在所有 Java 提交中击败了14.00% 的用户内存消耗:39.3 MB, 在所有 Java 提交中击败了92.33% 的用户/* 方法一:得到两个list 执行用时:8 ms, 在所有 Java 提交中击败了14.00% 的用户 内存消耗:39.3 MB, 在所有 Java 提交中击败了92.33% 的用户 */ public TreeNode commonBstNode(TreeN原创 2020-11-24 18:04:15 · 131 阅读 · 0 评论 -
Java,实现得到二叉树的最近公共祖先节点
标题:Java,实现得到二叉树的最近公共祖先节点一、方法四种:首先做这个题目,感觉知道这个会比较好://供参考的后序迭代输出二叉树的所有节点//供参考的后序迭代输出二叉树的所有节点public void postOrder(TreeNode head){ if(head == null){ return ; } Deque<TreeNode> s = new LinkedList<>(); s.push(head); while(!s.isEmpty()){原创 2020-11-24 14:46:21 · 533 阅读 · 0 评论 -
java实现二叉树的先中后序遍历
标题:java实现二叉树的先中后序遍历package com.hhh.aa.basicTreeBST03;import java.util.ArrayList;import java.util.Deque;import java.util.Iterator;import java.util.LinkedList;import java.util.Queue;import org.junit.Test;import com.hhh.aa.basicTree02.TreeNode;/*原创 2020-11-22 15:11:29 · 83 阅读 · 0 评论 -
java实现判断是否为二叉搜索树
标题:java实现判断是否为二叉搜索树一、分析1)第一种:对于二叉搜索树,首先想到的的是中序遍历,得到的是一个有序序列。所以方法可以是使用中序的递归,非递归进行实现,只要看是否为有序即可。方法一:中序非递归遍历,保存最小值为long cur = Long.MIN_VALUE;每次遍历得到一个节点的值时,比较是否大于当前最小值cur,满足条件则更新当前最小值。/** * 使用非递归实现 迭代版的【非递归中序遍历】,简单,容易实现 * 执行用时:2 ms, 在所有 Java 提交中击败原创 2020-11-20 10:49:03 · 1460 阅读 · 0 评论 -
Java实现填充每个节点的下一个右侧节点指针,对于不是完美二叉树而言
标题:Java实现填充每个节点的下一个右侧节点指针,对于不是完美二叉树而言可以先看看这个:Java实现填充每个节点的下一个右侧节点指针,对于完美二叉树而言一、题解方法:其实挺有巧劲的/** * 测试不完美二叉树 * 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户内存消耗:38.3 MB, 在所有 Java 提交中击败了86.90% 的用户 * @param head * @return */ public Node hasNext(Node hea原创 2020-11-16 17:02:29 · 87 阅读 · 0 评论 -
Java实现填充每个节点的下一个右侧节点指针,针对完美二叉树而言
标题:Java实现填充每个节点的下一个右侧节点指针一、题解方法一:这个题目的题解,首先会想到用广度遍历实现(非递归版本的),不过这个把每一行二叉树的节点当作链表,更有想法,同时也更优/** * 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户内存消耗:38.5 MB, 在所有 Java 提交中击败了88.17% 的用户 * @param head * @return */ public Node hasNext(Node head) { if(head原创 2020-11-16 16:59:40 · 100 阅读 · 0 评论 -
Java实现前序,中序得到二叉树
标题:Java实现前序,中序得到二叉树其实把中序,后序的改一下递归调用的条件就行了可以先了解Java实现通过中序,后序得到二叉树/** * 测试前中 * @author dell * */public class TestPreInOrder { /** *前中 使用递归 *执行用时:5 ms, 在所有 Java 提交中击败了28.63% 的用户内存消耗:38.3 MB, 在所有 Java 提交中击败了96.02% 的用户 * @return */ public Tr原创 2020-11-16 16:51:14 · 182 阅读 · 0 评论 -
Java实现通过中序,后序遍历得到二叉树
标题:Java实现通过中序,后序遍历得到二叉树一、题解方法一:使用递归,很容易想到/** *中后 *执行用时:4 ms, 在所有 Java 提交中击败了45.70% 的用户内存消耗:38.2 MB, 在所有 Java 提交中击败了99.17% 的用户 * @return */ public TreeNode inPostOrder(Integer[] a, Integer[] b, int as, int ae, int bs, int be) { if(as > ae原创 2020-11-16 16:48:03 · 239 阅读 · 0 评论 -
Java实现:最近公共祖先节点
标题:Java实现:最近公共祖先节点一、方法一 ,很容易想到,但不是最优解思想:找到两个满足条件的节点,得到他们的祖先节点1).使用非递归的后序遍历实现【因为先序遍历,直接删节点就行了,不需要后序遍历那么的麻烦,中序也同样】2)eg:栈中为:1-> 2 -> 3 那么说此节点数组中存放的为3,2,1因为 这样才是最近的公共祖先节点【注意:要包含自身】3)最后通过两个for循环,得到TreeNode/* * 使用后序遍历,得到两个链表 * * 执行用时:44 ms,原创 2020-11-13 12:28:51 · 602 阅读 · 0 评论 -
Java那些递归
标题:Java那些递归Java输出字符串全排列原创 2020-10-22 18:02:28 · 70 阅读 · 0 评论 -
Java输出字符串的全排列
标题:Java输出字符串的全排列/** * 全排列 【待续】 * @author dell * */public class TestAllSort { /** * int[] * 输出ABCD后,不会输出AB,只会输出DC * @param s * @param count * @param a */ public void allSort(String s, int count, int[] a) { if(count >= 4) { Syst原创 2020-10-22 17:59:21 · 245 阅读 · 0 评论 -
Java求解对称二叉树
标题:Java求解对称二叉树public class TestSymmetricBinaryTree03 { /** * 使用递归测试对称二叉树 * 思想: * p * 1)p.left == p.right * 2)右子树 对称 左子树 * @param p * @return */ public boolean symmetricBinaryTree(TreeNode p) { if(p == null) { return true; } re原创 2020-10-22 17:58:07 · 74 阅读 · 0 评论 -
Java实现求二叉树路径总和
标题:Java实现求二叉树路径总和public class TestPathSum02 { /** * 使用广度遍历, * */ public boolean pathSum(TreeNode p, int target) { if(p == null) { return false; } Queue<TreeNode> q = new LinkedList<>(); q.offer(p); while(!q.isEmpty())原创 2020-10-22 17:57:02 · 494 阅读 · 0 评论 -
Java实现求二叉树的最大深度
标题:Java实现求二叉树的最大深度public class TestMyTreeMaxLength12 { /** * 【递归】 * 执行结果: 通过 显示详情 执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户 内存消耗:38.7 MB, 在所有 Java 提交中击败了81.41% 的用户 * @param p */ public int maxLen(IntNode p, int count) { if(p == null) { retu原创 2020-10-22 17:56:03 · 506 阅读 · 0 评论 -
Java实现广度遍历二叉树
标题:Java实现广度遍历二叉树public class TestMyTreeBroad12 { /**方法一:不保存二叉树节点【使用递归】 * 我写的另一种递归 * 不过队列q要先赋值 【使用下面的函数hh】 * @param q */ public void boradorder(Queue<IntNode> q) { if(q.isEmpty()) { return ; }else { IntNode p = q.peek(); S原创 2020-10-22 17:54:36 · 268 阅读 · 0 评论 -
java实现二叉树的后序遍历
标题:java实现二叉树的后序遍历/** * 我的二叉树 【后序遍历】 * @author dell * */public class TestMyTreeB03 { /** * 测试遍历二叉树的后序遍历【先输出节点的值】 * @param p */ public void backorder(IntNode p) { if(p == null) { return ; }else { this.backorder(p.left); this.backo原创 2020-10-22 17:51:11 · 303 阅读 · 0 评论 -
Java实现二叉树的中序遍历
标题:Java实现二叉树的中序遍历/** * 我的二叉树 【中序遍历】 * @author dell * */public class TestMyTreeB02 { /** * 测试遍历二叉树的中序遍历【先输出节点的值】 * @param p */ public void midorder(IntNode p) { if(p == null) { return ; }else { this.midorder(p.left); System.out.p原创 2020-10-22 17:50:33 · 786 阅读 · 0 评论 -
Java实现二叉树的先序遍历含递归,非递归,Morris
标题:Java实现二叉树的先序遍历/** * 我的第一个二叉树 * @author dell * */public class TestMyTreeB { /** * 测试遍历二叉树的先序遍历【先输出节点的值】 * @param p */ public void preorder(IntNode p) { if(p == null) { return ; }else { System.out.print(p.val + " "); this.preord原创 2020-10-22 17:49:54 · 165 阅读 · 0 评论 -
Java实现链表的删除,返回被删节点
标题:Java实现链表的删除,返回被删节点一、分析:删除第i个节点【传入头结点,返回被删除的节点】 (head节点指向的链表中,若只有一个节点,则删除不了该节点)【传入头结点,返回头结点】,则对于删除任意的节点都可以Java两种方式实现链表的删除,返回头结点注意若返回被删除节点时,【head节点指向的链表中,若只有一个节点,则删除不了该节点,(因为删除了,对实参中的节点没有影响,不会改变形参中节点head的指向)】形参中head的改变不会影响实参head的改变【除非改变head对原创 2020-09-28 17:40:15 · 378 阅读 · 0 评论 -
Java两种方式实现向链表中插入元素
标题:Java两种方式实现向链表中插入元素1)方式:分是否在head处进行插入在head的前面新增一个节点,使得不需要分是否是在head处插入2)方式一:分是否在head处进行插入/** * 分是否在head处进行插入 * @param head * @param info * @param index * @return */ public ListNode insert(ListNode head,int info,int index) { ListNo原创 2020-09-28 17:29:59 · 1914 阅读 · 0 评论 -
Java的链表中,删除节点返回头结点,和被删节点的区别
标题:Java的链表中,删除节点返回头结点,和被删节点的区别对于如下方法:若传入head节点,返回的是被删节点,注意改变不了传入head的指向若传入head节点,返回的是头结点,则可以改变被删节点的直线具体分析如下:...原创 2020-09-27 23:44:40 · 258 阅读 · 0 评论 -
Java两种方式实现链表的删除,返回头结点
标题:Java两种方式实现链表的删除,返回头结点Java两种方式实现链表的删除,返回头结点。方式一:分是否是删除第一个节点public ListNode del(ListNode head,int n) { //head==null if(head==null) { return head; } if(n<1) { return null;//输入不合法 } //head 1 //若是再生成一个指针放在前面,则不需要分 1 和 n if(n==1)原创 2020-09-27 23:20:57 · 1355 阅读 · 0 评论 -
Java手写通用型链表,同时可以使用迭代器,foreach
标题:Java手写通用型链表,同时可以使用迭代器,foreach一、首先可以看看使用Java实现一个链表的思想手写链表二、实现一个通用型的链表【使用泛型】原理:将之前节点的int info–>T info,即使得链表更加通用【使用了泛型类】注意:为什么不建议直接将int info–>Object info,原因:使用,Object info可以实现通用型链表,但链表里的类型可以不固定,使得结构混乱eg:LinkedList list=new LinkedList();list.原创 2020-09-20 14:55:43 · 267 阅读 · 0 评论 -
解析Iterator,Iterable,手写迭代器
标题:解析Iterator,Iterable,手写迭代器可以这样理解Iterator,Iterable:Iterable接口中,有方法iterator(),使用foreach就需要实现此接口*对于自己写的一个链表,若是没有实现此接口则会出现编译错误如下: for(Object in:myList) {//只能通过 java.lang.Iterable 的数组或实例进行迭代iterator接口中,有方法hasNext(),next()一、一个不使用Iterator,Iterable的迭代原创 2020-09-20 14:48:16 · 344 阅读 · 0 评论 -
Java手写双向链表
标题:Java手写双向链表1.声明链表的节点样式:class IntSNode{ public int info; public IntSNode prev; public IntSNode next; public IntSNode(int info) { this(info,null,null); } public IntSNode(int info,IntSNode prev,IntSNode next) { this.info=info; this.prev=prev;原创 2020-09-20 13:48:05 · 418 阅读 · 0 评论 -
使用Java,手写链表
标题:使用Java,手写链表1.首先声明节点的样式:class IntNode{ public int info; public IntNode next; public IntNode(int info) { this(info,null); } public IntNode(int info,IntNode next) { this.info=info; this.next=next; }}2.写一个类似LinkedList样式的链表class IntNodeList原创 2020-09-20 13:37:57 · 359 阅读 · 0 评论 -
java排序算法之希尔排序
标题:java排序算法之希尔排序一、分析希尔排序,就是在直接插入排序中,减少了比较次数【直接插入排序的升级版】。二、解题直接插入排序:从第二个元素起,每次取一个元素,插入到该元素的前面位置中,按递增顺序排列的子序列中的合适位置public int[] directInsert(int[] a) { for(int i=1;i<a.length;i++) { int temp=a[i]; while(i>0 && temp<a[i-1]) {原创 2020-08-14 18:13:12 · 118 阅读 · 0 评论 -
java排序算法之快速排序
标题:java排序算法之快速排序一、分析快速排序,就是每次取第一个数,经过排序后 ,使得左边的小于该数,右边的大于该数对于此数组eg:32,15,6,48,19,21,47第一次排序后21,15,6,19,32,48,47可以发现32的左边小于它,右边大于它。此后,就可以将32的两边分开进行递归【重复上述的第一次排序步骤】。参考代码如下:public int[] quickSort(int[] a,int start,int end) { if(start>=end) {原创 2020-08-14 17:50:58 · 95 阅读 · 0 评论 -
Java排序算法之归并排序
标题:Java排序算法之归并排序一、思想将n个记录看成是n个长度为1的有序子表组成将两两相临的子表归并一个有序子表二、解题过程第一步: * 将a[]看成是两个子表, * 一个起点为start1 ,长度为len1 * 一个起点为start2 ,长度为len2 * 对两个子表进行排序【利用两个子表已排好序的特性】/** *将a[]看成是两个子表, *一个起点为start1 ,长度为len1 *一个起点为start2 ,长度为len2 *对两个子表进行排序【利用两个子表已原创 2020-08-04 16:58:09 · 75 阅读 · 0 评论 -
Java排序算法之直接选择【简单选择】排序
标题:Java排序算法之直接选择【简单选择】排序一、思想每次从剩下的无序序列中,选取最小的放入,重复上述步骤public int[] directChoose(int[] a) { for(int i=0;i<a.length-1;i++) { int min=a[i]; int index=i; boolean flag=false; for(int j=i;j<a.length;j++) { if(min>a[j]) { flag=t原创 2020-08-04 16:54:19 · 165 阅读 · 0 评论 -
Java排序算法之直接插入排序
标题:Java排序算法之直接插入排序一、原理从第二个元素一直到最后一个元素,依次和前面的子序列进行比较,若j>0 && a[j]<a[j-1]此元素小于它的前一个元素,则进行交换,重复上述步骤,直到此元素>=它的前一个元素。核心代码如下:for(int i=1;i<a.length;i++) { int j=i; while(j>0 && a[j]<a[j-1]) { int temp=a[j]; a[原创 2020-08-03 16:34:19 · 100 阅读 · 0 评论 -
Java的排序算法之冒泡排序
标题:Java的排序算法之冒泡排序一、原理迭代n-1次,每一次都将【0–>n-1-i】中最大的元素迭代到最后面去,对于这样的数组{32,15,6,48,19,21,2}即第一次遍历0-->n-1;{32,15,6,48,19,21,2},排序后为{15,6,32,19,21,2,48};第二次遍历第二次排序后的【即不需遍历48】0->n-2;{15,6,32,19,21,2},排序后为{6,15,19,21,2,32,48};核心代码如下:for(int i=0;i<原创 2020-08-03 16:28:54 · 151 阅读 · 0 评论 -
Java中,求两个数组的交集,使用了HashMap,排序
标题:Java中,求两个数组的交集一、分析方式一:长度较短的数组作为外层循环,使用两层for循环进行遍历同时使用标记数组nums来判断此元素是否匹配成功了【匹配成功了,则将nums[j]=true】,最后通过return Arrays.copyOfRange(results, 0, t);来返回数组 for(int i=0;i<numsMin.length;i++){ for(int j=0;j<numsMax.length;j++){原创 2020-07-13 12:16:04 · 3184 阅读 · 0 评论 -
Java中最大子序列求和
标题:Java中最大子序列求和一、分析1)方式一 * 方式一:取每一个正数, * 遍历i后面所有的数,求和,发现有最大的就保存2)方式二找到一个正数 ,给max,及其索引赋初值移动j,temp+=arr[j],判读temp的值,若大于0保存找到的现有的最大的值,继续移动j,若小于0,则temp减去arr[i]后,移动i/** * 最大子序列求和 * @author dell * */public class TestMaxNumbers { /** * 方式一:取原创 2020-07-06 10:54:52 · 277 阅读 · 0 评论 -
Java中使用泛型实现颠倒任意数组中的所有元素
标题:Java中使用泛型实现颠倒任意数组中的所有元素一、分析方法playEle02:新建一个Object数组,实现交换,return (T[])str;//str为数组类型,将T[]当作一个类型使用此处的强制转换会有问题,因为Object[] str=new Object[arr.length];为Object数组,里面的元素也为Object类型,故强制转换有问题public <T> T[] playEle02(T[] arr) { int j=arr.length-1;原创 2020-07-05 15:05:59 · 583 阅读 · 0 评论