![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 51
Twilight.c
这个作者很懒,什么都没留下…
展开
-
堆排序
基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意:没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆一般升序采用大顶堆,降序采用小顶堆基本思想1)将待排序序列构成一个大顶堆2)此时,整个序列的最大值就是堆顶的根结点3)将其与末尾元素进行交换,此原创 2020-07-28 14:19:37 · 244 阅读 · 0 评论 -
约瑟夫问题
JosephuJosephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此 产生一个出队编号的序列。解决方案用一个不带头结点的单向循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开 始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从原创 2020-07-20 19:21:04 · 174 阅读 · 0 评论 -
交换两个变量的值
方法一最常用方法int temp = num1;num1 = num2;num2 = temp;方法二利用两数和法num1 = num1 + num2;num2 = num1 - num2;num1 = num1 - num2;好处:不用定义临时变量弊端:相加操作结果可能会溢出、只适用于数值类型方法三使用位运算(异或)num1 = num1 ^ num2;num2 = num1 ^ num2;num1 = num1 ^ num2;...原创 2020-07-15 15:12:03 · 227 阅读 · 0 评论 -
二叉树的构建(非常简便)
自己研究的一种创建树比较简便且容易理解的方法,平时刷题如果需要创建树,该方法也是很快捷的。import java.util.*;class TreeNode { int val; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val =...原创 2020-02-19 00:38:07 · 495 阅读 · 0 评论 -
平衡二叉树判断
import java.util.*;class TreeNode { int val; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}public class Test { /** ...原创 2020-02-13 16:54:28 · 244 阅读 · 0 评论 -
快排及前k小或第k大数通用求解
思路超级简单的快速排序,手写快排专用。public int partition(int[] r, int i, int j) { int temp = r[i]; while(i < j) { while(i < j && r[j] > temp) { j--; } if(i < j) ...原创 2020-02-07 12:16:40 · 321 阅读 · 0 评论 -
最短路径之Dijkstra算法
通过迪杰斯特拉(Dijkstra)算法解决了从某个源点到其余各顶点的最短路径问题。算法的时间复杂度为O(n^2),这个算法容易让人误解的地方是,可不可以只找到从源点到某一个特点终点的最短路径,其实这个和求源点到其他所有顶点的最短路径一样复杂,时间复杂度依然为O(n^2)。 下面是该算法的示例代码import java.util.ArrayList;import java.util.Arr...原创 2018-08-06 16:16:09 · 531 阅读 · 0 评论 -
最小生成树之kruskal算法
import java.util.ArrayList;import java.util.Collections;import java.util.List;public class TestKruskal { public class Edge implements Comparable<Edge> { /** 起始顶点 */ pub...原创 2018-07-31 15:51:35 · 242 阅读 · 0 评论 -
最小生成树之prim算法(邻接表和邻接矩阵)
直接上代码 抽象类import java.util.List;public abstract class Adjacency&amp;amp;lt;V&amp;amp;gt; { /** 总权重 */ protected int totalWeight; /** 顶点的父亲 */ protected int[] parent; /** 保存顶点的添加顺序 */ pr...原创 2018-07-30 23:02:06 · 3542 阅读 · 0 评论 -
使用回溯法解决八皇后问题(同样适用于N皇后)。
在学习数据结构的时候,看到了一道八皇后的问题。写完后,再去网上查看发现原来这个问题有这么多的优化解法,相比之下相形见绌。但我还是记录下来,有兴趣的小伙伴可以看看。 先大致说下我的思路 创建一个初始化值为0的8x8的数组,0代表无皇后且不在其他皇后的攻击范围,-1代表皇后的位置,&amp;amp;amp;amp;amp;amp;gt;0的整数代表格子在皇后的攻击范围。例如某个格子的数字为3说明该格子在3个皇后的攻击范围。 下面是代码,最后求...原创 2018-07-22 17:12:55 · 838 阅读 · 0 评论 -
求n以内素数个数多种方法时间复杂度对比
import java.util.Scanner;public class PrimeNumber { /** * 穷举法,检测所有可能的因子。 * 时间复杂度为:O(n^2) */ public void primeNumber1(int n) { int number = 2; int count = 0; ...原创 2018-07-21 21:56:56 · 6410 阅读 · 3 评论 -
最短路径之Floyd算法
弗洛伊德算法的时间复杂度为O(n^3),用于求所有顶点到所有顶点的最短路径。核心思想就是运用中转顶点来找到最短路径。 下面是示例代码public class TestFloyd<V> { /** 点到点的路径 */ private int[][] pathMatrix; /** 点与点之间的权值 */ private int[][] sho...原创 2018-08-06 16:43:22 · 269 阅读 · 0 评论 -
动态规划案例解析
先看一道题目给定一个填充有非负数的m x n网格,找到一条从左上到右下的路径,该路径使沿其路径的所有数字之和最小。注意:你只能在任何时间点向下或向右移动。Input:[&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;[1,3,1],&amp;amp;amp;nbsp;&amp;amp;amp;n原创 2018-10-20 12:29:21 · 417 阅读 · 0 评论 -
在一个字符串中找出最长回文子串
如何高效的在一个字符串中找到最长的回文串呢?下面我们根据代码来分析 首先,回文串有两种,一种是字符串的长度是偶数,另一种就是奇数。 我们从字符串第二个字符开始,同样我们把当前起始字符叫做k 先检验奇数长度的字符串,对比该字符的前一个和后一个(k - 1 和 k + 1),一共三个字符(奇数个),如果前后字符相同则说明是回文串,就把当前字符与保存的回文palindromic进行比较...原创 2018-10-07 15:18:08 · 4028 阅读 · 0 评论 -
输出前k大的数
题目来源OpenJudge 对于这道题目,最简单的方法就是直接运用quick sort对数组进行排序。虽然这样也能得到结果,不过效率非常低(nlogn)。有没有更高效的方法呢?答案是有的,运用quick sort的分治思想,其实就是快排的变种。 &nb...原创 2018-11-04 22:44:26 · 800 阅读 · 0 评论 -
仙岛求药(经典的BFS和DFS运用题)
原题目来自OpenJudge下面的都是Java实现的先看看思路比较简单的BFSimport java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Scanner;public class Noi2727 { private static char[][...原创 2018-11-10 14:41:24 · 1121 阅读 · 0 评论 -
使用回溯法和排列树(降维和减枝)解决N皇后问题
上一篇博客使用回溯法和子集树(降维法)解决N皇后问题运用了降维,极大的提高了计算效率。不过能不能再精益求精呢?~能的,还能继续优化。前面运用了排列树,对于4x4来说,子集规模为nn = 44 = 256。这里我们采用减枝进一步优化。思路很简单,假如x[0] = 1,则x[1],x[2],x[3]就不可能在等于1。x[0] = 1就代表皇后摆放在第一行的第2个位置。则后面2,3,4行就不可能摆...原创 2018-11-28 22:20:23 · 2557 阅读 · 0 评论 -
使用回溯法和子集树(降维法)解决N皇后问题
之前写过一篇也是关于N皇后的博客,不过当初使用的是二维数组存储。不仅是空间开销还是这里大致说下二维数组的子集规模计算方法例如是4x4。如果按照二维数组存放,设二维数组为x[][]1 0 0 00 1 0 00 0 1 00 0 0 1因为x[0][0]有1(摆放)和0(不摆放)两种可能。所以可以用下面的树来表示计算开销的规模。...原创 2018-11-27 22:53:30 · 1831 阅读 · 0 评论 -
运用分支定界法(分支限界法)解决01背包问题
首先初始化总容量capacity = 10、物品总数量number = 4物品信息为【4,10】、【7、42】、【5、25】、【3、12】,分别为重量weight,价值value。解决该题目运用到的数据结构有:优先队列、二叉树、存放物品基本信息的数组这里主要就是构建二叉树,二叉树节点的属性有weight(当前总容量)value(当前总价值)layer(当前层级,用来判断是否为叶子节点)...原创 2018-12-05 20:38:42 · 31367 阅读 · 11 评论 -
判断二叉树是否是完全二叉树
判断二叉树是否是完全二叉树,主要判断有2点1、如果当前节点没有左孩子,则当前节点不应该有右孩子。2、如果当前节点没有左孩子或者右孩子,则当前节点的兄弟节点(这里一般是指该节点父节点的右孩子)不应该有子节点。package com.aekc.algorithm;import java.util.LinkedList;/** * @author Twilight */public ...原创 2019-01-29 20:36:47 · 682 阅读 · 0 评论