数据结构与算法
数据结构与算法、以及算法题
DZSpace
个人公众号:DZSpace
展开
-
《数据结构与算法》专栏导航(实时更新)
1.数据结构与算法1.1 线性表1.2 栈1.3 队列1.4 串1.5 树1.5.1 二叉树遍历查找删除1.5.2 顺序存储二叉树1.5.3 线索化二叉树(中序遍历)1.5.4 堆排序——树应用1.5.5 赫夫曼树——树应用1.5.6 赫夫曼编码——树应用1.5.7 赫夫曼编码(实现数据的解压)——树应用1.5.8 赫夫曼编码(实现文件的压缩和解压)——树应用1.5.9 平衡二叉树1.6 图1.7 查找1.8 排序1.9 递归...原创 2022-04-18 22:16:11 · 344 阅读 · 0 评论 -
zzulioj 1105: 判断友好数对(函数专题)Python
zzulioj 1105: 判断友好数对(函数专题)Python题目描述输入两个正整数m和n,顺序输出m到n之间的所有友好数对。如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。例如:1184和1210是友好数对,因为1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=12101210的因子之和为1+2+5+10+11+22+55+110+121+242+605=1184要求程序定义一个facsum ()函数和一个main()函数,原创 2020-12-05 16:10:28 · 409 阅读 · 1 评论 -
11.1 有效的字母异位词(哈希表)——【LeetCode】
package com.haxitable.java;import java.util.ArrayList;public class one { public boolean isAnagram(String s, String t) { int[] record = new int[26];//记录26个字母出现的次数 for(char c : s.toCharArray()) { record[c - 'a'] += 1; } for(char c : t.t.原创 2022-01-29 22:31:39 · 64 阅读 · 0 评论 -
1.5.1 二叉树遍历、查找、删除——【Java数据结构与算法】
package com.atguigu.tree;public class BinaryTreeDemo { public static void main(String[] args) { //创建二叉树 BinaryTree binaryTree = new BinaryTree(); //创建结点 HeroNode root = new HeroNode(1, "宋江"); HeroNode node2 = new HeroNode(2, "吴用"); HeroNod原创 2022-01-02 21:42:20 · 78 阅读 · 0 评论 -
1.5.3 线索化二叉树(中序遍历)——【Java数据结构与算法】
package com.atguigu.tree.threadedbinarytree;public class ThreadedbinaryTreeDemo { public static void main(String[] args) { //创建结点 HeroNode root = new HeroNode(1, "tom"); HeroNode node2 = new HeroNode(3, "jack"); HeroNode node3 = new HeroNode(..原创 2022-01-03 16:11:19 · 80 阅读 · 0 评论 -
9.6 二叉排序树——【Java数据结构与算法】
package com.atguigu.binarysorttree;public class BinarySortTreeDemo { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 2}; BinarySortTree binarySortTree = new BinarySortTree(); //循环的添加结点到二叉排序树 for(int i = 0; i&...原创 2022-01-15 22:57:48 · 53 阅读 · 0 评论 -
11.8 迪杰斯特拉算法(Dijkstra)(常用算法)——【Java数据结构与算法】
package com.atguigu.dijkstra;import java.util.Arrays;public class DijkstraAlgorithm { public static void main(String[] args) { char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; //邻接矩阵 int[][] matrix = new int[vertex.length][vertex.length.原创 2022-01-22 21:52:06 · 93 阅读 · 0 评论 -
9.1 堆排序——【Java数据结构与算法】
要求:给一个数组{4,6,8,5,9},要求使用堆排序法,将数组升序排序。(注:升序使用大顶堆,降序使用小顶堆)package com.atguigu.tree;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class HeapSort { public static void main(String[] args) { //要求将数组进行升序排序 in原创 2022-01-04 20:14:38 · 60 阅读 · 0 评论 -
9.4 赫夫曼编码(实现数据的解压)——【Java数据结构与算法】
创建赫夫曼树、生成赫夫曼编码、数据的压缩可见9.3节:点击链接直接看//测试第六步:完成数据的解压package com.atguigu.huffmancode;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util原创 2022-01-13 22:45:18 · 70 阅读 · 0 评论 -
9.3 赫夫曼编码(创建赫夫曼树、生成赫夫曼编码、实现数据压缩)——【Java数据结构与算法】
package com.atguigu.huffmancode;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class HuffmanCode { publi...原创 2022-01-08 22:02:19 · 541 阅读 · 0 评论 -
11.1 二分查找非递归的方式(常用算法)——【Java数据结构与算法】
package com.atguigu.binarysearchnorecuision;public class BinarySearchNoRecur { public static void main(String[] args) { //测试 int[] arr = {1,3, 8, 10, 11, 67, 100}; int index = binarySearch(arr, 100); System.out.println("index=" + index); .原创 2022-01-18 17:14:37 · 245 阅读 · 0 评论 -
9.5 赫夫曼编码(实现文件的压缩和解压)——【Java数据结构与算法】
创建赫夫曼树、生成赫夫曼编码、数据的压缩和解压可见9.3、9.4节:9.3节链接9.4节链接看代码的测试第七步、第八步:package com.atguigu.huffmancode;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStre原创 2022-01-14 14:26:40 · 114 阅读 · 0 评论 -
11.2 分治算法(常用算法)——【Java数据结构与算法】
package com.atguigu.dac;public class hanoiTower { public static void main(String[] args) { hanoiTower(5, 'A', 'B', 'C'); } //汉诺塔移动的方法 //使用分治算法 public static void hanoiTower(int num, char a, char b, char c) { //如果只有一个盘 if(num == 1) {...原创 2022-01-18 22:40:51 · 145 阅读 · 0 评论 -
11.7 克鲁斯卡尔算法(常用算法)——【Java数据结构与算法】
总结:其实就是在不停的选择最短边,并保证不构成回路的过程package com.atguigu.kruskal;import java.util.Arrays;public class KruskalCase { private int edgeNum;//边的个数 private char[] vertexs;//顶点数组 private int[][] matrix;//邻接矩阵 //使用 INF 表示两个顶点不能连通 private static final int INF原创 2022-01-22 10:08:53 · 100 阅读 · 0 评论 -
11.3 动态规划-背包问题(常用算法)——数据结构与算法
package com.atguigu.dynamic;public class KnapsackProblem { public static void main(String[] args) { int[] w = {1, 4, 3};//物品的重量 int[] val = {1500, 3000, 2000}; //物品的价值 这里val[i] 就是前面讲的v[i] int m = 4; //背包的容量 int n = val.length; //物品的个数 ...原创 2022-01-20 17:30:29 · 85 阅读 · 0 评论 -
11.6 普里姆算法(Prim)(常用算法)——【Java数据结构与算法】
package com.atguigu.prim;import java.util.Arrays;public class PrimAlgorithm { public static void main(String[] args) { //测试看看图是否创建ok char[] data = new char[]{'A','B','C','D','E','F','G'}; int verxs = data.length; //邻接矩阵的关系使用二维数组表示,10000..原创 2022-01-21 20:55:30 · 149 阅读 · 0 评论 -
1.5.2 顺序存储二叉树——【Java数据结构与算法】
package com.atguigu.tree;public class ArrBinaryTreeDemo { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7}; //创建ArrayBinaryTree ArrBinaryTree arrayBinarytree = new ArrBinaryTree(arr); arrayBinarytree.preOrder();//1 ..原创 2022-01-03 12:37:07 · 63 阅读 · 0 评论 -
10.1 图的深度优先遍历与广度优先遍历——【Java数据结构与算法】
package com.atguigu.graph;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;public class Graph { private ArrayList<String> vertexList; //存储顶点集合 private int[][] edges; //存储邻接矩阵 private int numOfEdges; //表示边的数目原创 2022-01-17 18:18:37 · 97 阅读 · 0 评论 -
11.4 KMP算法-字符串匹配(常用算法)——【Java数据结构与算法】
package com.atguigu.kmp;import java.util.Arrays;public class KMPAlgorithm { public static void main(String[] args) { String str1 = "BBC ABCDAB ABCDABCDABDE"; String str2 = "ABCDABD"; //String str2 = "BBC"; int[] next = kmpNext("ABCDABD")原创 2022-01-20 23:05:30 · 54 阅读 · 0 评论 -
11.10 马踏棋盘算法(常用算法)——【Java数据结构与算法】
package com.atguigu.horse;import java.awt.Point;import java.util.ArrayList;import java.util.Comparator;public class HorseChessboard { private static int X;// 棋盘的列数 private static int Y;// 棋盘的行数 //创建一个数组,标记棋盘的各个位置是否被访问过 private static boolean ..原创 2022-01-22 21:54:49 · 83 阅读 · 0 评论 -
9.7 平衡二叉树——【Java数据结构与算法】
代码可以直接看// 4.添加结点的方法package com.atguigu.avl;public class AVLTreeDemo { public static void main(String[] args) { //int[] arr = {4,3,6,5,7,8}; //int[] arr = { 10, 12, 8, 9, 7, 6 }; int[] arr = { 10, 11, 7, 6, 8, 9 }; //创建一个 AVLTree对象 AVLTree.原创 2022-01-16 22:28:36 · 75 阅读 · 0 评论 -
11.5 贪心算法(常用算法)——【Java数据结构与算法】
package com.atguigu.greedy;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;public class GreedyAlgorithm { public static void main(String[] args) { //创建广播电台,放入到Map HashMap<String, HashSet<String>> broa...原创 2022-01-21 19:57:53 · 87 阅读 · 0 评论 -
9.2 赫夫曼树——【Java数据结构与算法】
赫夫曼树即树的带权路径长度(wpl)最小的树,也成为最优二叉树package com.atguigu.huffmantree;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class HuffmanTree { public static void main(String[] args) { int arr[] = { 13, 7, 8, 3, 29, 6,原创 2022-01-05 13:32:42 · 52 阅读 · 0 评论 -
11.9 弗洛伊德算法(常用算法)——【Java数据结构与算法】
总结:三层for循环即可实现package com.atguigu.floyd;import java.util.Arrays;public class FloydAlgorigthm { public static void main(String[] args) { // 测试看看图是否创建成功 char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; //创建邻接矩阵 int[][] matrix = new i原创 2022-01-22 21:53:26 · 431 阅读 · 0 评论 -
zzulioj 1107: 回文数猜想(函数专题)Python
题目描述一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之原创 2021-01-15 22:33:08 · 323 阅读 · 1 评论 -
zzulioj 1108: 打印数字图形(函数专题)Python
题目描述从键盘输入一个整数n(1≤n≤9),打印出指定的数字图形。要求在程序中定义并调用如下函数:PrintSpace(m)用来输出m个空格;PrintDigit(m)来输出一行中的数字串"12…m…21"(该行中的最大数字是m)。函数原型如下:void PrintDigit(int m);void PrintSpace(int m);输入正整数n(1≤n≤9)。输出指定数字图形。样例输入5样例输出 1 121 12321 1234321123454原创 2021-01-17 13:58:29 · 1059 阅读 · 1 评论 -
zzulioj 1109: 数根(函数专题)Python
题目描述输入一个正整数,输出该数的数根。数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根。如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。比如,对于24来说,把2和4相加得到6,由于6是一位数,因此6是24的数根。再比如39,把3和9加起来得到12,由于12不是一位数,因此还得把1和2加起来,最后得到3,这是一个一位数,因此3是39的数根。要求使用函数,定义函数digitSum(int n)求n的各位数字和,其余原创 2021-01-18 09:39:17 · 231 阅读 · 1 评论 -
zzulioj 1106: 回文数(函数专题)Python
ZZULIOJ 1106: 回文数(函数专题)Python题目描述一个正整数,如果从左向 右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。输入两个整数m和n(m<n),输出区间[m,n]之间的回文数。输入输入两个正整数m和n,输入保证m<n。输出按从小到大的顺序,输出m到n之间的回文数,每个数后面有一个空格。样例输入100 200样例输出101 111 121 131 141 151 161 171 181 191代码如下:原创 2020-12-08 21:55:52 · 679 阅读 · 1 评论 -
红黑树——【数据结构与算法】
1.红黑树的产生先了解二叉搜索树:二叉搜索树就是在二叉树的基础上增加有序性这样就能快速的查找、删除、插入元素了但是插入的数据的顺序较为特殊时,二叉搜索树有可能会变成类似链表的结构:所以,在极限情况下,二叉查找树的时间复杂度是非常差的。既然,插入元素后有可能导致二叉查找树的性能变差,那么,我们是否可以增加一些手段,让插入元素后的二叉查找树依然性能良好呢?为了解决浪费计算机性能以及浪费时间复杂度等问题,从而诞生了红黑树。2.红黑树红黑树(Red Black Tree)是一种自平衡的二叉查原创 2022-04-30 15:48:45 · 72 阅读 · 0 评论 -
单词拆分——【LeetCode】
// 举例: s = "leetcode", wordDict = ["l","eet", "code"] public boolean wordBreak(String s, List<String> wordDict) { // dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。 // 这里的dp为valid boolean[] valid = new boolean[s.len...原创 2022-04-29 10:18:39 · 107 阅读 · 0 评论 -
完全平方数——【LeetCode】
public int numSquares(int n) { int max = Integer.MAX_VALUE; int[] dp = new int[n+1]; //初始化 for(int j = 0; j <= n; j++) { dp[j] = max; } dp[0] = 0;//当和为0时,组合的个数为0 for(int i = 1; i * i .原创 2022-04-29 10:17:06 · 88 阅读 · 0 评论 -
零钱兑换——【LeetCode】
public int coinChange(int[] coins, int amount) { int max = Integer.MAX_VALUE; int[] dp = new int[amount + 1]; //初始化dp数组为最大值 for(int j = 0; j < dp.length; j++) { dp[j] = max; } //当金额为0时需要的硬币数目为.原创 2022-04-29 10:16:05 · 98 阅读 · 0 评论 -
爬楼梯——【LeetCode】
public int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; }原创 2022-04-29 10:14:53 · 91 阅读 · 0 评论 -
组合总和——【LeetCode】
/* * 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 * 如果求排列数就是外层for遍历背包,内层for循环遍历物品。(本题) */ public int combinationSum4(int[] nums, int target) { int[] dp = new int[target + 1]; dp[0] = 1; for(int i = 0; i <= target; i++) {//..原创 2022-04-29 10:13:44 · 89 阅读 · 0 评论 -
零钱兑换II——【LeetCode】
//举例amount = 5, coins = [1, 2, 5] public int change(int amount, int[] coins) { //递推表达式 int[] dp = new int[amount + 1]; //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装 dp[0] = 1; for(int i = 0;i < coins.length; i++) {//先遍历co.原创 2022-04-29 09:34:10 · 92 阅读 · 0 评论 -
完全背包理论——【LeetCode】
//先遍历物品,再遍历背包 private static void testCompletePack(){ int[] weight = {1, 3, 4}; int[] value = {15, 20, 30}; int bagWeight = 4; int[] dp = new int[bagWeight + 1]; for (int i = 0; i < weight.length; i++){ // 遍历.原创 2022-04-29 09:19:11 · 88 阅读 · 0 评论 -
一和零——【LeetCode】
public int findMaxForm(String[] strs, int m, int n) { //dp[i][j]表示i个0和j个1时的最大子集 int[][] dp = new int[m + 1][n + 1]; int oneNum, zeroNum; for (String str : strs) { oneNum = 0;//记录1 zeroNum = 0;//记录0.原创 2022-04-28 10:29:02 · 210 阅读 · 0 评论 -
目标和——【LeetCode】
public int findTargetSumWays(int[] nums, int target) { int sum = 0; //先求和sum for (int i = 0; i < nums.length; i++) sum += nums[i]; if ((target + sum) % 2 != 0) return 0; int size = (target + sum) / 2; if(size < 0) size = -s..原创 2022-04-28 10:24:42 · 99 阅读 · 0 评论 -
最后一块石头的重量——【LeetCode】
public int lastStoneWeightII(int[] stones) { int sum = 0; for (int s : stones) { sum += s; } int target = sum / 2; //dp[i][j]为可以放0-i物品,背包容量为j的情况下背包中的最大价值 int[][] dp = new int[stones.length][targ.原创 2022-04-28 10:23:04 · 99 阅读 · 0 评论 -
分割等和子集——【LeetCode】
class Solution { public boolean canPartition(int[] nums) { int sum = 0; for (int i = 0; i < nums.length; i++) { sum += nums[i]; } if (sum % 2 == 1) return false; int target = s..原创 2022-04-28 10:21:36 · 223 阅读 · 0 评论