数据结构与算法
文章平均质量分 89
问明
胸藏文墨怀若谷,腹有诗书气自华
展开
-
你还不懂排序?(冒泡、插入、归并、希尔、快排、鸡尾酒)
常见排序算法的时间复杂度冒泡排序:https://blog.csdn.net/qq_44837912/article/details/104192776插入排序:https://blog.csdn.net/bjweimengshu/article/details/99372874归并排序:https://blog.csdn.net/bjweimengshu/article/detai...原创 2020-03-29 10:02:41 · 104 阅读 · 0 评论 -
判断链表是否有环及环的入点和长度(Java)
/** 链表环问题* */public class LinkedIsCycle { /* * 链表节点 * */ private static class Node{ int data; Node next; public Node(int data) { this.data = d...原创 2020-02-02 18:26:00 · 360 阅读 · 0 评论 -
二叉树四种遍历方式(前、中、后、层)
一. 遍历方式前序遍历:根节点,左子树,右子树;中序遍历:左子树,根节点,右子树;后序遍历:左子树,右子树,根节点;层序遍历:一层一层的横向遍历。前三种遍历方式统称为:深度优先遍历;第四种遍历方式又叫:广度优先遍历二. 示例要求:用四种遍历方式遍历如下二叉树代码实现import java.util.Arrays;import java.util.LinkedLis...原创 2020-02-04 10:29:59 · 223 阅读 · 0 评论 -
单链表反转(Java实现)
public class Node { private Object data;//数据域 private Node next;//指针域 public Node(Object data){ this.data = data; } public Node(Object data,Node next){ thi...转载 2020-04-08 12:09:11 · 194 阅读 · 0 评论 -
Java实现:判断字符串括号的对称性算法(美团一面撕代码+唯品会笔试)
题目:判定字符串中括号({}()[])的对称性示例1:输入:abd(sss[ssdfd])输出:true示例2:输入:abd(dcd(cdbh[])输出:false解法思路:利用Stack栈先进先出特性stack.peek()与stack.pop()区别peek能获取到栈顶数据不会移除栈,pop获取到栈顶数据会移除栈代码:import java.util.*;pu...原创 2020-04-03 11:58:48 · 450 阅读 · 0 评论 -
这些常用算法技能,你get了吗?(动态规划、Dijkstra 算法等)
动态规划算法:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653190796&idx=1&sn=2bf42e5783f3efd03bfb0ecd3cbbc380&chksm=8c990856bbee8140055c3429f59c8f46dc05be20b859f00fe8168efe1e6a9...原创 2020-03-30 09:18:05 · 106 阅读 · 0 评论 -
怎么判断两个单向链表相交
一. 问题分析两个链表相交,那么两个链表中的节点一定有相同地址。两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。(问:为什么? 答:因为每一个节点最多只能有一个下一节点,因此在相交节点之后,链表不可能再分为两个链表)二. 问题解法根据两个链表是否存在环来分类讨论无环无环的情况有两种比较快速的解决方式,这两种方式本质上都是基于 一、问题分析 中的第二...转载 2020-03-28 14:32:31 · 1405 阅读 · 0 评论 -
最短路径
public class Path { public static int minDistance(String word1, String word2) { int m = word1.length(); int n = word2.length(); int[][] dp = new int[m+1][n+1]; fo...原创 2020-03-23 10:20:56 · 119 阅读 · 0 评论 -
输入一个字符串S和字符串数组arr,输出arr中以s为前缀的字符串并排序
输入描述:第一行:输入一个字符串S第二行:字符串数组arr输出描述:输出arr中以s为前缀的字符串并排序示例输入:ababc bbd aba abk abd cc dd输出:abaabcabdabk代码import java.util.Arrays;import java.util.Scanner;public class Main {...原创 2020-03-22 17:12:23 · 784 阅读 · 0 评论 -
合并两个有序数组,并进行排序和去重(Java实现)
import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner...原创 2020-03-22 16:55:43 · 2428 阅读 · 3 评论 -
字符串常用技巧
一. toCharArray()作用将字符串转为字符数组示例public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String sc = in.next(); char[] ch = s...原创 2020-01-27 18:24:45 · 196 阅读 · 0 评论 -
链表的实现(Java)
public class Linked { //链表节点 private static class Node { Node next; int data; public Node(int data) { this.data = data; } } //头节点 priva...原创 2020-02-02 18:23:08 · 181 阅读 · 0 评论 -
图解红黑树
一. 简介 红黑树是一种含有红黑结点并能自平衡的二叉查找树。满足如下性质:性质1:每个节点要么是黑色,要么是红色。性质2:根节点是黑色。性质3:每个叶子节点(NIL)是黑色。性质4:每个红色结点的两个子结点一定都是黑色。性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。 自平衡的方式左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结...转载 2020-03-01 10:34:46 · 78 阅读 · 0 评论 -
输入一个字符串,求出该字符串包含的字符集合。
题目输入一个字符串,求出该字符串包含的字符集合。输入描述每组数据输入一个字符串,字符串最大长度为100,且只包含字符,不能为空串,区分大小写。输出描述每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。示例输入abcqwerabc输出abcqwer代码import java.util.Scanner;class So...原创 2020-03-05 17:51:37 · 2224 阅读 · 0 评论 -
给定一个字符串S1和其子串S2,找出S2在S1的第一个位置
题目:给定一个字符串S1和其子串S2,找出S2在S1的第一个位置。示例:示例1:输入:S1 = “abcadcdvfcdg" S2 = "cd"输出:5示例2:输入:S1 = “cdhbvdjhbvf" S2 = "bv"输出:3代码import java.util.Scanner;class Solution { public s...原创 2020-03-05 15:12:48 · 2795 阅读 · 0 评论 -
快速排序(Java)
一. 简介原理:分治法思想:在每一轮挑选出一个基准数,并让其他比他大的元素移动到一边,比他小的元素移动到数列的另一边,从而把数列拆分成两个部分。平均时间复杂度:O(nlogn)二. 基准数最简单的方式是选择数列的第一个元素。绝大多数情况下,此方法是没问题的,但对于一些情况是不合适的,如当第一个元素太大或太小(如逆序序列排序成顺序序列)等情况,会将算法“退化”。随机选择一个......原创 2020-02-07 12:14:25 · 220 阅读 · 0 评论 -
鸡尾酒排序(Java)
一. 概念冒泡排序:每一轮排序都是从左到右的单向进行元素的比较。点此回顾冒泡排序鸡尾酒排序:(1)奇数轮比较时,从左到右把相邻的两个元素进行比较,当一个元素大于右侧相邻元素时,交换他们的位置;否则,位置不变。 (2)偶数轮比较时,从右到左把相邻的两个元素进行比较,当一个元素小于左侧相邻元素时,交换他们的位置;否则,位置不变。二. Java实现代码import java.util....原创 2020-02-06 16:15:19 · 622 阅读 · 0 评论 -
冒泡排序(Java)
一. 概念把相邻的两个元素进行比较,当一个元素大于右侧相邻元素时,交换他们的位置;否则,位置不变。二. 举例常规的冒泡排序——时间复杂度为O(n^2) 原始数列 进行第一趟排序 第一趟排序后的结果 进行第二趟排序 第二趟排序后的结果 第三到七趟的排序结果冒泡排序改进改进1:在第六轮排序后,整个数列已经有序,无需进行第七轮排序 ;...原创 2020-02-06 15:09:46 · 211 阅读 · 0 评论 -
常见排序算法的时间复杂度
一. 时间复杂度为O(n^2)的排序算法冒泡排序选择排序插入排序希尔排序(它的性能略优于O(n^2),但又次于O(nlogn),姑且归入此类)二. 时间复杂度为O(nlogn)的排序算法快速排序归并排序堆排序三. 时间复杂度为线性的排序算法计数排序归并排序基数排序...原创 2020-02-06 10:21:08 · 395 阅读 · 0 评论 -
优先队列
一. 简介队列:先进先出,将新元素置于队尾,出队时,队头元素最先被移除。优先队列(1)最大优先队列:不管入队顺序如何,都是当前最大的元素优先出队;(1)最小优先队列:不管入队顺序如何,都是当前最小的元素优先出队。二. 优先队列的实现二叉堆是实现堆排序和优先队列的基础。点此回顾二叉堆因二叉堆的“上浮”、“下沉”时间复杂度均为O(logn),所以优先队列的时间复杂度也是O(logn...原创 2020-02-05 15:40:59 · 185 阅读 · 0 评论 -
二叉堆
一. 简介二叉堆的本质是一种完全二叉树。可分为最大堆(父节点的值>=左、右孩子节点的值)和最小堆(父节点的值<=左、右孩子节点的值);虽然二叉堆是一个完全二叉树,但它并不是链式存储,而是顺序存储,即它的所有节点存储在数组中。二. 二叉堆的自我调整自我调整即把不符合堆性质的完全二叉树调整成一个堆。三. 代码实现怎么确定父节点的左、右孩子的位置呢?假设父节点的下标是p...原创 2020-02-04 17:24:27 · 234 阅读 · 0 评论 -
递归算法(从简到繁)
一. 1+2+3+…+nimport java.util.Scanner;public class Recursion { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); System....原创 2020-02-03 17:13:49 · 285 阅读 · 0 评论 -
散列表(哈希表)
一. 简介 散列表也叫哈希表,是存储Key-Value映射的集合。通过哈希函数实现Key和数组下标的转换,通过开放寻址法和链表法解决哈希冲突,且读写操作时间复杂度接近O(1)。二. 原理哈希函数散列表是基于数组的,通过哈希函数把Key和数组的下标进行转换。哈希函数的实现方式有很多种,以HashMap中的哈希函数为例:每个对象都有属于自己的hashcode(唯一性),而hashco...原创 2020-02-03 10:52:29 · 558 阅读 · 0 评论 -
队列的实现(Java)
这是一个循环队列,不但充分利用列数组的空间,还避免了数组元素整体移动,且入队、出队时间复杂度均为O(1)public class MyQueue { private int[] array; private int front; private int rear; public MyQueue(int capacity) { this.array...原创 2020-02-02 19:13:29 · 153 阅读 · 0 评论 -
位运算符
按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)、按位取反(~)原创 2020-01-30 10:28:59 · 123 阅读 · 0 评论 -
巧用位运算
一. 奇偶数的判断原理一个整数n与1按位与等于1(即n & 1 == 1),则此整数n是奇数,否则为偶数。示列public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextI...原创 2020-01-29 23:08:08 · 119 阅读 · 0 评论