![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
小布丁value
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 56 - II. 数组中数字出现的次数 II
力扣链接class Solution { public int singleNumber(int [] nums){ HashMap<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ map.put(nums[i],map.getOrDefault(nums[i],0)+1); } for.原创 2021-11-04 11:41:13 · 48 阅读 · 0 评论 -
(重要)剑指 Offer 32 - III. 从上到下打印二叉树 III
力扣链接public List<List<Integer>> levelOrder(TreeNode root){ Queue<TreeNode> queue= new LinkedList<>(); List<List<Integer>> res = new LinkedList<>(); if(root!=null) queue.add(root); ..原创 2021-11-04 11:18:03 · 58 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
力扣链接class Solution { //先序遍历循环A树 public boolean isSubStructure(TreeNode A,TreeNode B){ return (A!=null&&B!=null)&&(recur(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B)); } public boolean recu..原创 2021-11-03 15:47:50 · 53 阅读 · 0 评论 -
剑指Offer31 栈的压入 ,弹出序列
栈的压入 ,弹出序列代码思路:class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { if(pushed==null||pushed.length<0||popped==null||popped.length<0) return false; Stack<Integer> stack=new Stack<>()原创 2021-10-22 11:38:15 · 51 阅读 · 0 评论 -
剑指Offer35.复杂链表的复制
复杂链表的复制代码思路:给定链表的头结点head,复制普通链表很简单,只需遍历链表,每轮建立新节点+构建前驱节点pre和当前节点node的引用指向即可。本题链表的节点新增了 random指针,指向链表中的任意节点或者null,random意味着在复制过程中,除了维护pre.next还要维护pre.random.方法一:哈希表利用哈希表的查询特点,考虑构建原链表节点和新链表节点的键值对映射关系,在遍历构建新链表各结点的next和random引用指向即可。算法流程:1.若头结点head为空,返原创 2021-10-21 11:48:45 · 107 阅读 · 0 评论 -
希尔排序
希尔排序/*** 希尔排序:* 是一种插入排序,是对插入排序的优化,避免过小的数字移动时插入了太多次* 代码思路:* 1.分组排序 gap表示分成几组 gap=arr.length/5;* 2.本例中 arr.length=10;* 3.分别分成 5 组,在组,一组,进行排序即可** */public class Day09061 { public static void main(String[] args) { int arr[] = {8, 9, 1, 7原创 2021-09-06 11:09:08 · 84 阅读 · 0 评论 -
堆排序
堆排序大根堆:所有父节点的值大于等于子节点的值小根堆:所有父节点的值小于邓等于子节点的值堆排序基本思想:1.将待排序列构造成一个大根堆2.此时整个序列的最大值就是堆顶的跟结点3.将其与末尾元素进行交换,此时末尾就是最大值4然后 将剩余n-1个元素重新构造一个值,反复循环即可。/**** i表示叶子结点在数组中索引* length 表示对多少个元素继续调整,length是在逐步的减少** */public class Day09022 { public static v原创 2021-09-02 20:58:36 · 61 阅读 · 0 评论 -
输入两个整数序列,第一个序列表示栈的压入顺序,判断第二个序列是否为该栈
输入两个整数序列,第一个序列表示栈的压入顺序,判断第二个序列是否为该栈在这里插入代码片```/** 输入两个整数序列,第一个序列表示栈的压入顺序,判断第二个序列是否为该栈* 如:压入顺序为1,2,3,4,5,* 弹出序列5,4,3,2,1/4,3,2,5,1/5,3,2,4,2 error** */class Test{ public static boolean isPopArray(int[]pushArray,int[]popArray){ if(popArr原创 2021-07-23 15:54:25 · 808 阅读 · 0 评论 -
循环队列概念
定义1.数组成环,新增头部和尾部2.增加元素用尾插法,tail++;删除元素head++;但是有一个问题tail或着head 从5变到0,该如何加呢?加1取余代码实现public class circleQueue<T> { private T[] element; private int head; private int tail; public circleQueue(){ element=(T[])new Object[1原创 2021-07-20 18:19:59 · 116 阅读 · 0 评论 -
判断链表是否有环(简单)
public class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow = head; ListNode fast = head.next; while (slow != fast) { ..原创 2021-07-16 21:53:33 · 86 阅读 · 0 评论 -
树结构的基础部分
树结构的基础部分二叉树为什么需要树这种数据结构1.数组存储方式的分析2.链式存储的分析3.树存储方式的分析树示意图二叉树遍历的说明使用前序,中序和后序对下面的二叉树进行遍历.代码思路如下代码实现二叉树-查找指定节点代码思路代码实现二叉树为什么需要树这种数据结构1.数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要删除具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图2.链式存储的分析优点:在一定程度上对数组存储原创 2021-06-13 20:32:34 · 86 阅读 · 0 评论 -
单向链表增删改查
//单向链表 public static class SingleLink<T extends Comparable<T>> implements List<T> { private Node<T> Head; private Node<T> Tail; private int size; public Node<T> getTail() { return Tail; }原创 2021-04-18 13:20:18 · 100 阅读 · 0 评论 -
递归循环两种方法实现快速排序
public class QuickTest { //一次排序的过程 public static int partition(int []array,int low,int high){ //把第一个元素当作基准 int mar=array[low]; while(low<high){ //从后往前找比基准小的 //如果比基准大high-- while(low&l.原创 2021-04-18 14:51:27 · 382 阅读 · 0 评论 -
力扣剑指Offer25合并两个有序的单链表简单
思路:1.四个指针 p q tail newHeadnewHead保存最小的头节点p=newHead.next; p是下一个q是另一个链表的结点2.当p>q时 尾巴指向q,q=q.next q后移,注意在后移之前维护tail3.考虑特殊情况:q或者p==null的时候直接把tail执行另一个结点就好了,因为链表本身有序代码入下/** * Definition for singly-linked list. * public class ListNode { * int原创 2021-04-20 21:31:08 · 84 阅读 · 0 评论 -
循环实现归并排序简单
归并排序* 思想:把两个有序的序列归并为一个有序的序列* 如何保证两个序列是有序的?两个序列中元素个数为1public class MergetTest { public static void merge(int []array,int gap){ int left1=0; int left2=left1+gap-1; int right1=left2+1; int right2=right1+gap-1>array.原创 2021-04-21 14:51:06 · 277 阅读 · 0 评论 -
选择排序及优化
#选择排序从当前待排序列中选择最小值(最大值)与第一个值(最后一个值进行交换)时间复杂度0(n2)空间复杂度0(1)稳定性:不稳定;`在这里插入代码片public class SelectTest {public static void selectSort(int[]array){ //趟数 for(int i=0;i<array.length/2;i++){ int minIndex=i; //遍历整个数组,找出最小数原创 2021-04-12 23:45:04 · 84 阅读 · 0 评论 -
直接插入排序以及优化
#直接插入排序`在这里插入代码片/** 直接插入排序* 模拟打扑克牌,从待排序列(由小到大)中拿数据temp,从手中的数据(牌)中从前往后找第一个大于目标牌的数* 这个时候需要注意有两种情况* 1.如果找到比目标牌大的数,把从这个数开始到拿出牌的最后一个数后移,空出的位置及放入目标牌* 2.如果没有找到,直接插入到拿出牌的末尾即可。** 时间复杂度0(n2)* 空间复杂度o(1)* 稳定性:稳定* 优化* 从后往前找,直接插入//如果找到的第一个元素就比他小,在这个元素的后面直原创 2021-04-12 17:35:32 · 300 阅读 · 0 评论 -
冒泡排序及其优化
#数据结构排序之冒泡排序两两比较,大的往后走,小的往前走时间复杂度 O(n2)空间复杂度o(1);稳定性:稳定1 2 3 4 5优化用一个标志Flag实现有序只排一趟序在这里插入代码片public class BubbleTest { public static void BubbleSort(int[] array) { //趟数//n-1 for (int i = 0; i < array.length; i++) {原创 2021-04-12 14:23:50 · 85 阅读 · 0 评论 -
两个栈实现一个队列
在这里插入代码片题目:两个栈实现一个队列 思路和算法 维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作。 插入操作: 直接在第一个栈栈定插入即可 删除操作: 1.第一个栈的元素全部入第二个栈 删除第二个栈的栈顶元素即可 注意第二个栈如果不为空,里面已经有顺序颠倒的元素,直接输出栈顶元素即可 */public class Test3 { Deque&l原创 2021-04-11 11:41:22 · 64 阅读 · 0 评论 -
力扣 225用队列实现一个栈(两种方法)
在这里插入代码片/** 题目:用队列实现一个栈* 方法一:用两个队列实现一个栈* */class Test2<T>{ Queue<Integer> queue1; Queue<Integer> queue2; public Test2(){ queue1=new LinkedList<>(); queue2=new LinkedList<>(); } public原创 2021-04-11 11:40:43 · 74 阅读 · 0 评论 -
在栈中能得到栈的最小元素Min 函数,保证时间复杂度为O(1)
在这里插入代码片2.在栈中能得到栈的最小元素Min 函数,保证时间复杂度为O(1)*/class Test1 {public static Stack dataStack = new Stack<>();public static Stack assistStack = new Stack<>();//以o(1)的时间复杂度返回dataStack中的最小元素public static int getMin() {if (dataStack.isEmpty(原创 2021-04-11 10:02:17 · 86 阅读 · 0 评论 -
泛型方法自定义队列
在这里插入代码片```*知识点:泛型方法自定义队列* */class MyQueue<T>{ private T[] elements; private int tail;//队尾 入 private int head;//队头 出 private int size; private static final int defaultCapacity=3; public MyQueue(){ this(defaultCapac原创 2021-04-11 07:07:07 · 145 阅读 · 0 评论 -
泛型方法自定义栈
在这里插入代码片 /* * 1.泛型的方法自定义栈 * */class MyStack<T>{ private T[] elements; private int top;//栈顶指针相当于elements.length或size private static final int defaultCapacity=5;//数组长度 public MyStack(){ this(defaultCapacity); }原创 2021-04-10 23:28:57 · 171 阅读 · 0 评论