数据结构与算法
数据结构与算法
落英神剑碧海潮生
桃花影落飞神剑,碧海潮生按玉箫
展开
-
链表相关题目
给定两个升序链表的头指针head1和head2,打印两个链表的公共部分思路:利用指针head1和head2从头开始比较挨个比较两个链表的值如果head1处的数较小,则向后移动head1 如果head2处的数较小,则向后移动head2 如果两个值相等则打印 只要head1或者head2其中一个为null,则停止。public static void printPublic(Node head1, Node head2) { while(head1 != null &&.原创 2020-09-20 22:56:20 · 114 阅读 · 0 评论 -
矩阵相关题目
顺时针打印矩阵/** * @param matrix 矩阵本身 * @param LR 左上角的行标 * @param LC 左上角的列标 * @param RR 右上角的行标 * @param RC 右上角的列标 */public static void printEdge(int[][]matrix, int LR, int LC, int RR, int RC) { /** * 如果不是方阵,那么可能会出现这种棒状结构 * LR =原创 2020-09-12 15:10:52 · 187 阅读 · 0 评论 -
【剑指Offer】树
定义树节点static class TreeNode{ int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; }}重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。public static TreeNode buildTree(int[] p原创 2020-10-09 19:53:03 · 108 阅读 · 0 评论 -
【树】AVL树
普通二叉查找树存在的缺陷如上图,如果树的结构是这样一种形式,那么他就会失去二分查找这种高效率的特性。所以基于此才有了AVL树。AVL树(平衡二叉查找树)该树的一个特点就是首先他是一个二叉查找树,在此之上,该树中任何一个节点的左右子树的高度差都不超过1。也就是它时刻保持着左右子树的高度平衡。如何保持高度平衡(旋转)最熟悉的左旋右旋,左旋可以降低右子树的高度。与之相反右旋可以降低左子树的高度。文字表达太过生硬。左旋右旋如下图。下面是以节点E为基准的左旋示意图:如上图这颗树的.原创 2020-08-15 19:15:45 · 150 阅读 · 0 评论 -
【树】二叉查找树
二叉查找树简介二叉查找树: BST(Binary Search Tree)又称为二叉排序树或者二叉搜索树。二叉查找树的特性:任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点。二叉查找树增删节点快,查询效率高。一般来讲,数组增删元素比较慢。链表结构增删快但查询效率慢。而二叉查找树囊括了这二者的优点。添加节点往二叉查找树中添加节点时,从树根开始索引,如果新节点的值大于根节点的值则直接在右子树中找.原创 2020-08-13 19:10:51 · 139 阅读 · 0 评论 -
【排序】堆排序
堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二又树: 每个结点的值都大于或等于其左右孩子结点的值,称为大根堆。注意:没有要求结点的左孩子的值和右孩子的值的大小关系 每个结点的值都小于或等于其左右孩子结点的值,称为小根堆堆排序的基本思想:将无序序列构建成一个堆,根据升序或降序需求选择大顶堆或小顶堆; 将堆顶元索与末尾元素交换,将最大元素“沉”到数组末端; 重新原创 2020-08-13 00:57:44 · 424 阅读 · 0 评论 -
【树】树与二叉树详解
树树是一种数据结构。它的特点如下:每个节点有零个或多个子节点。没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点除了根节点外,每个子节点可以分为多个不相交的子树如下图就是一颗树相关术语:节点的度: 一个节点(上图中一个圆圈就是一个节点)含有的子节点的个数称为该节点的度。( 上图A节点的度为2 B节点的度为3 J节点的度为0 ) 树的度: 一棵树中,最大的节点的度称为树的度(.上图B节点的度为3,最大) 叶节点或终端节点: 没有子节点的节点称为叶子节点。也即度为0的节..原创 2020-08-11 19:42:30 · 1705 阅读 · 0 评论 -
【排序】五种排序整理
冒泡排序冒泡排序的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序(以升序为例,前面的值大于后面的值就是逆序了)则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。假如有数组:int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0}; public static int[] BubbleSort(int[] arr) { int tmp = 0; boolean flag = false原创 2020-08-10 20:25:30 · 487 阅读 · 0 评论 -
【递归】迷宫问题
递归的概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用机制以递归求阶乘为例public class Test { public static void main(String[] args) { System.out.println(jieChen(5)); //输出120 } public static int jieChen(int n) {原创 2020-08-09 17:02:54 · 272 阅读 · 0 评论 -
【栈】逆波兰计算器
栈(stack)栈是一个先进后出(FILO First In Last Out)的有序列表。 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端, 为变化的一端, 称为栈顶(Top), 另一端为固定的一端, 称为栈底(Bottom)。 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。栈只有两个操作:入栈(压栈)和出栈数组模拟栈:public class MySt原创 2020-08-09 00:55:52 · 196 阅读 · 0 评论 -
【单向循环链】约瑟夫环问题
约瑟夫环问题描述:设编号为1, 2, ... n的n个人围坐一圈,约定编号为k (1<=k<=n) 的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。单向循环链示意图:假如现在1,2,3,4 四个人围坐成一圈,我们让其从编号为1的人开始报数,数3个数之后的那个人出列,出列之后从他的下一个人又接着数3个数.....知道所有人都出列为止。那么出列的顺序应该是:3--->2--->.原创 2020-08-08 12:17:51 · 201 阅读 · 0 评论 -
散列表存储员工信息
google公司的一 个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址),当输入该员工的d时,要求查找到该员工的所有信息。要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)保证按照id从低到高插入使用一个简易的散列表解决问题:数组 + 单向链表散列表结构:public class MyHashTable { private Node[] table; private int capacity; ..原创 2020-07-28 23:41:30 · 280 阅读 · 0 评论 -
【查找】四种查找算法
顺序查找顺序查找(Sequential Search)又叫线性查找,是最简单直接暴力的查找方法。就是从头至尾挨个寻找,找到位置。当遍历完没找到就说明要找的数据不存在。它不要求数据有序。该算法的时间复杂度为O(n)。public static int seqSearch(int[] arr, int value) { for(int index = 0; index < arr.length; index++) { if(arr[index] == value) {原创 2020-07-28 00:54:27 · 787 阅读 · 0 评论 -
统计字符串中字符出现次数
最近好多同学忙着找工作,其中分享出来一道算法题,是找出重复次数最多的元素,忽然想起来教主教过的统计字符串中字符出现次数的算法。记录一下。思路(只统计ASCII码包含的字符):ASCII码表一共128个字符。创建一个大小为128的int类型数组array。遍历字符串中的字符,将字符值(128以内)作为array数组的下标,每遇到一个相同的则改下标处的元素值加1。这样就将每个出现过的字符及其次数统计出来,当然遍历arrayList可得到出现次数最多的字符。package com.mec.censu原创 2020-07-13 22:50:53 · 1353 阅读 · 1 评论 -
二维数组与稀疏数组之间转换
稀疏数组当一个数组中大部分元素为0或者同一个值时,可以使用稀疏数组保存数组。这样将大大节省空间。比如下围棋如图所示如果使用二维数组,就会有很多无意义的空间,转换成稀疏数组将大大压缩空间使用。二维数组转换为稀疏数组思路首先要遍历二维数组,目的是拿到有效数据个数用于确定稀疏数组的空间大小。 生成稀疏数组。(一定要记录原数组总的行列值) 遍历二维数组以填充稀疏数组,获取其中有效数据值,并记录该值的在原二维数组中的行值和列值。public static int[][] arrT..原创 2020-07-13 16:58:49 · 225 阅读 · 0 评论