
数据结构与算法
Linging_24
好记性不如烂笔头。
展开
-
数据结构-栈-表达式运算
【代码】数据结构-栈-表达式运算。原创 2024-03-10 22:31:10 · 583 阅读 · 0 评论 -
数据结构-稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。原创 2024-03-10 10:06:42 · 470 阅读 · 0 评论 -
剑指Offer第五十一题:构建乘积数组
题目描述:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。分析:特殊情况:B[0] = A[1] * A[2] * ... * A[n-1]正常情况:原创 2020-10-10 21:13:35 · 166 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
节点类型:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */第一种方法:创建一个头结点,使用遍历原链表,使用头插法,重新构建链表,实现反转。//定义一个头结点,遍历链表,将链表的节点头插到新的链表中//借助一个头结点public ListNode原创 2020-10-30 11:04:43 · 219 阅读 · 0 评论 -
快慢指针
常见的问题:中间值问题单链表是否有环找到有环链表的入口节点1、中间值问题:LeetCode: 链表的中间结点public ListNode middleNode(ListNode head) { ListNode fast = head; //快指针 ListNode slow = head; //慢指针 //由于链表的节点个数有奇数个和偶数个 //偶数个时,fast == null是退出条件 //奇数个时,fast.next == null 是原创 2020-10-30 12:37:23 · 137 阅读 · 0 评论 -
单调递减队列
【代码】单调递减队列。原创 2023-05-09 21:58:03 · 155 阅读 · 1 评论 -
给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点
【代码】给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点。原创 2022-12-11 20:52:29 · 451 阅读 · 0 评论 -
如何判断一颗二叉树是否是平衡二叉树
【代码】如何判断一颗二叉树是否是平衡二叉树。原创 2022-12-11 20:39:05 · 264 阅读 · 0 评论 -
如何判断一颗二叉树是否是满二叉树
【代码】如何判断一颗二叉树是否是满二叉树。原创 2022-12-11 20:34:56 · 474 阅读 · 0 评论 -
如何判断一颗二叉树是否是完全二叉树
【代码】如何判断一颗二叉树是否是完全二叉树。原创 2022-12-11 20:30:24 · 419 阅读 · 0 评论 -
如何判断一颗二叉树是否是搜索二叉树
【代码】如何判断一颗二叉树是否是搜索二叉树。原创 2022-12-11 20:20:38 · 426 阅读 · 0 评论 -
数据结构与算法汇总及leetcode经典题记录
数据结构与算法原创 2022-12-11 19:49:28 · 521 阅读 · 0 评论 -
二叉树的三种遍历递归与非递归实现
public class Main8 { public static void main(String[] args) { Node root = createTwoTree(); // 前序遍历 preSort(root); System.out.println("==========前序遍历==========="); preSort2(root); System.out.println("====原创 2021-12-06 22:07:05 · 474 阅读 · 0 评论 -
构造无向图--邻接表--dfs与bfs遍历
/** * 无向图 */public class UndirectedGraph { private final int v; //记录顶点数量 private int e; //记录边的数量 private Queue<Integer>[] adj; //邻接表 public UndirectedGraph(int v){ this.v = v; this.e = 0; this.adj =原创 2020-11-05 21:05:05 · 665 阅读 · 0 评论 -
并查集
/** * 并查集 */public class UF { //数组下标为数据,数组的值为分组的标识 private int[] eleAndGroup; //记录分组的组数 private int count; //N 分组的组数 public UF(int N){ this.count = N; this.eleAndGroup = new int[N]; for (int i = 0; i <原创 2020-11-05 13:53:58 · 296 阅读 · 0 评论 -
优先队列
最大优先队列,堆实现public class MaxPriorityQueue<T extends Comparable<T>> { private T items[]; private int size; public MaxPriorityQueue(int capacity){ this.items = (T[])new Comparable[capacity+1]; this.size = 0; }原创 2020-11-05 09:16:43 · 154 阅读 · 0 评论 -
java实现堆排序
从小到大排序:public class HeapSort{ /** * 判断i索引处的元素是否小于j索引处的元素 * @param heap 堆 * @param i 索引 * @param j 索引 * @return heap[i] < heap[j] */ private boolean less(Comparable[] heap, int i, int j){ return heap[i].com原创 2020-11-04 16:10:44 · 386 阅读 · 0 评论 -
排序算法时间复杂度
原创 2020-11-03 15:39:49 · 226 阅读 · 0 评论 -
希尔排序
//希尔排序--普通希尔排序--不稳定//平均时间复杂度: O(n^1.3) 最好时间复杂度:O(n) 最坏时间复杂度:O(n^2) public static void xier_sort(int[] a){ //1.找到增量 int h = 1; //增量初始值为1 while(h < a.length/2){ h = 2 * h + 1; } //2.h>=1时,进行排序 while(h >= 1){原创 2020-11-03 15:38:54 · 280 阅读 · 4 评论 -
归并排序--学习
public class MergeSort { //辅助数组,负责保存归并子区间的结果 static int[] assist = null; public static void main(String[] args) { int[] a = {9,8,7,6,5,4,3,2,1}; sort(a); System.out.println(Arrays.toString(a)); } //归并排序 pub原创 2020-11-03 15:37:30 · 403 阅读 · 1 评论 -
快速排序--学习
/** * 快速排序 O(nlogn)---不稳定 * @param a 待排序数组 * @param left 左边界(包括) * @param right 右边界(包括) */public static void quick_sort(int a[], int left, int right){ if(left >= right) return; int tmp = a[left]; //选择最左边的元素作为标志,并保存临时变原创 2020-11-03 15:37:02 · 176 阅读 · 0 评论 -
直接插入排序
//未优化的插入排序public static void cha_sort(int[] a) { //默认第一个元素有序,从第二个元素开始 for (int i = 1; i < a.length; i++) { for(int j = i-1; j >= 0; j--){ if(a[j+1] < a[j]){ //直接交换 int tmp = a[j+1]; a[j原创 2020-11-03 15:36:06 · 809 阅读 · 0 评论 -
冒泡排序
/** * 冒泡排序-稳定 * 时间复杂度 * 最好(顺序): O(n) * 最坏(逆序): O(n^2) * @param a 待排序的数组 */public static void bubble_sort(int a[]){ for(int i = a.length-1; i > 0; i--){ boolean flag = false; for(int j = 0; j &原创 2020-11-03 15:35:11 · 149 阅读 · 0 评论 -
选择排序
/** * 选择排序--从小到大-不稳定 * @param a 待排序的数组 */public static void choose_sort(int a[]){ for (int i = 0; i < a.length-1; i++){ int minIndex = i; for(int j = i + 1; j < a.length; j++){ //每次找到最小值放到前边,所以是从j+1开始原创 2020-11-03 15:33:15 · 165 阅读 · 0 评论 -
构造大根堆和小根堆--数组
/** * 构造大根堆 * @param <T> */public class BigHeapTree<T extends Comparable<T>>{ //存放的元素 private T[] items; //元素个数 private int size; public BigHeapTree(int capacity){ items = (T[]) new Comparable[capacity + 1原创 2020-11-03 15:30:18 · 578 阅读 · 2 评论 -
二叉搜索树的实现
二叉搜索树(BST)二叉搜索树它是二叉树的一种类别,其节点按特定顺序排列。这也称为有序二叉树。在二叉搜索树中,左子树中所有节点的值小于根的值。类似地,右子树中所有节点的值大于或等于根的值。此规则将递归地应用于根的所有左子树和右子树。前序遍历:30,15,7,22,17,27,60,45,75中序遍历: 7,15,17,22,27,30,45,60,75后序遍历:7,17,27,22,15,45,75,60,30二叉查找树的实现:API设计:1.节点类:2.二叉搜索树类://原创 2020-10-31 21:19:31 · 288 阅读 · 0 评论 -
四根柱子的汉诺塔,求最小移动次数
#include<iostream>#include<cmath> using namespace std;//level: 当前要移动的汉诺塔是第level层,最上一层为第一层 int move(int level, char start, char end){ //printf("[%d] %c -> %c\n",level, start, end);...原创 2020-03-15 19:25:54 · 2288 阅读 · 0 评论 -
全排列
排列问题对给定的字符集的规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。【例1】字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,31 2,321.法一. 字典序法:就是按照字典排序的思想逐一产生所有排列。如何通过字典序找到下一个排列呢?【例2】设有排列 §=2763541 ,按照字典序排列,它的下一个...原创 2018-10-24 21:30:18 · 300 阅读 · 0 评论 -
判断二叉树是否同构
class TreeNode { int left; int right; String value;}public class Main { /* 8 A 1 2 B 3 4 C 5 - D - - E 6 - G 7 - F - - H - - 8 G - 4 B 7 6 F - - A...原创 2020-02-26 13:11:25 · 631 阅读 · 0 评论 -
一元多项式的相加和相乘
多项式按指数递减排列。//链表节点class Point { int ceof; //系数 int expon; //指数 Point next;}public class Main { public static void main(String[] args) { polynomial(); } /** * 输入两个一元多项式(系数,指数)...原创 2020-02-26 11:34:10 · 621 阅读 · 0 评论 -
堆栈实现中缀表达式转后缀表达式
/** * 将一个中缀表达式转换为后缀表达式 * @param s */ public static String InToend(String s) { /** * 1、运算数: 输出。 * 2、左括号::入栈。 * 3、右括号:将栈顶的运算符弹出并输出,直到遇到左括号(弹出但不输出)。 * 4、运算符: * 1、如果优先级大于栈顶运...原创 2020-02-24 17:31:38 · 653 阅读 · 0 评论 -
二叉树
概念引用自:https://blog.youkuaiyun.com/qq_35896304/article/details/90268316树的定义:1.树包含n(n ≥≥ 0 )个节点,n = 0时称为空树。2.在树的结构关系中,有且仅有一个节点没有前趋节点,这个节点称为树的根节点。3.除根节点外,树中其他的节点有且仅有一个前趋节点,但可以有很多后继节点。如图,A为根节点。树的基本术语:...原创 2020-01-22 11:48:17 · 1012 阅读 · 0 评论 -
字符串匹配KMP
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一,它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到...原创 2023-04-22 16:01:00 · 190 阅读 · 1 评论 -
java实现二叉搜索树的基本功能
在二叉查找树中:(01) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(02) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(03) 任意节点的左、右子树也分别为二叉查找树。(04) 没有键值相等的节点(no duplicate nodes)。直接上个码:/** * @注:泛型T必须是实现了Comparable接口。 * * @aut...翻译 2019-02-16 16:42:52 · 267 阅读 · 0 评论 -
java 队列的实现
Java中提供了Queue队列接口,可以继承此接口实现队列的数据结构,Java中提供了以下实现类,可以根据需要选择合适的队列@see LinkedList@see PriorityQueue@see java.util.concurrent.LinkedBlockingQueue@see java.util.concurrent.BlockingQueue@see java.util.c...翻译 2019-02-10 13:49:45 · 310 阅读 · 0 评论 -
java栈的实现
一.数组实现的栈,能存储任意类型的数据。/** * java 使用数组来实现栈,能存储任意数据 * * @author Linging * @date 2019/2/10 * */import java.lang.reflect.Array;public class ArrayStack&lt;T&gt; { private final static int DEFA...原创 2019-02-10 13:13:07 · 2440 阅读 · 0 评论 -
java接口实现顺序表
定义顺序表接口:public interface OrderTable { //返回顺序表的长度 public int size(); //判断顺序表是否为空 public boolean isEmpty(); //判断顺序表是否为满 public boolean isFull(); //向顺序表中加元素x public void add(String x); //在顺序表中n...原创 2019-02-09 17:00:24 · 924 阅读 · 0 评论 -
java单链表的简单实现
节点类代替“结构体”:public class Node { public String data; //存储数据 public Node next; //连接下一个节点 public Node(String data) { this.data = data; }}实现单链表的基本方法:/** * java单链表的简单实现 * * @date...原创 2019-02-09 16:52:47 · 307 阅读 · 0 评论 -
java实现循环双链表
/** * 循环双链表的简单实现 * * @author Linging * @date 2019/2/9 * * 注:java自带的集合包有实现双链表 */public class DoubleList&lt;T&gt; { //表头 public DNode&lt;T&gt; head; //节点个数 private int Count; //定义节点结...翻译 2019-02-09 16:31:42 · 949 阅读 · 0 评论