经典算法专栏
讲解一些常用经典算法
DJL_DJL_DJL
程序是我的生命,但我相信爱她甚过爱我的生命。
展开
-
返回两个节点的最低公共祖先【二叉树递归套路】
题目: 给定一棵二叉树的头结点head,和另外两个节点a和b。返回a和b的最低公共祖先原创 2022-01-19 09:16:59 · 226 阅读 · 0 评论 -
判断二叉树是否为满二叉树、平衡二叉树、完全二叉树、二叉搜索树【固定套路】
下面的递归套路如果可以灵活应用的话,几乎可以解决所有二叉树的题目,包括树上的动态规划二叉树的递归套路:假设以x节点为头,假设可以向X左树和X右树要任何信息在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要)列出所有可能性后,确定到底需要向左树和右树要什么样的信息把左树信息和右树信息求全集,就是任意一棵子树都需要返回的信息S递归函数都返回S,每一棵子树都这么求写代码,在代码中考虑如何把左树的信息和右树的信息整合出整棵树的信息一、判断是否为满二叉树代码如下:package原创 2022-01-18 09:58:06 · 825 阅读 · 0 评论 -
微软面试题---利用二叉树最基本的知识解决纸的对折问题
这道题目的如果基础扎实的话,解决思路会很简单,代码也特别短,就是二叉树的中序遍历代码如下:package com.Algorithm;public class Code2_PaperFolding { //i代表当前节点 N代表总共的层数 //true表示折痕为凹 false表示折痕为凸 public static void process(int i,int N,boolean T) { if(i>N) return; process(i+1, N, true); Sys.原创 2022-01-16 23:58:20 · 71 阅读 · 0 评论 -
求二叉树最宽的层有多少个节点(Java版)
用到的核心知识点就是层序遍历,题目难度一般,通过设置两个临时变量即可解决package com.Algorithm;import java.util.LinkedList;import java.util.Queue;public class Code1_BTMaxWidthNum { public static class Node{ int value; Node left; Node right; public Node(int v) {原创 2022-01-16 23:49:53 · 82 阅读 · 0 评论 -
异或运算题目
一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数 // 一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数 public static void print_1(int[] arr) { int eor=0; for(int i=0;i<arr.length;i++) { eor = eor^arr[i]; } int rightOne = eor&(-eor);//提取..原创 2022-01-15 10:19:38 · 173 阅读 · 0 评论 -
矩阵乘法模板
模板代码:package com.DJL.ArraysMatrix;import java.util.Arrays;public class 矩阵运算 { static long[][] matrixMultiply(long[][] m1, long[][] m2) { int n = m1.length; int m = m1[0].length; if (m != m2.length) { throw new Il原创 2021-08-03 16:14:30 · 152 阅读 · 0 评论 -
子矩阵最大累加和
题目描述:解法:可以参考求和最大连续子数组解法package com.DJL.ArraysMatrix;import java.util.Arrays;public class Practice_子矩阵最大累加和 { //求一维数组中的子数组的最大连续和 static int solve_1(int[] arr) { int sumJ = arr[0]; int max = sumJ; for (int j = 1; j <原创 2021-08-03 16:12:34 · 52 阅读 · 0 评论 -
求和最大连续子数组
题目描述:第一种解法(时间复杂度为O(n^2)):package com.DJL.ArraysMatrix;/** * @author DJL * @create 2021-08-03 14:43 */public class Practice_求和最大连续子数组 { //暴力破解法,时间复杂度为:O(n) static void sovel_1(int[] arr) { int maxSum = arr[0]; for (int i = 0原创 2021-08-03 16:09:29 · 59 阅读 · 0 评论 -
边界为1的最大子方阵
题目描述:第一种解法(超时):package com.DJL.ArraysMatrix;public class Practice_边界为一的最大子方阵 { static int solve(int[][] A) { int N = A.length; int n = N;//动态变化的阶数 while (n > 0) { for (int i = 0; i < N; i++) {原创 2021-08-03 16:02:21 · 83 阅读 · 0 评论 -
零所在行列清零
题解:package com.DJL.ArraysMatrix;public class Practice_零所在行列清零 { static void solve(int[][] matrix){ int N = matrix.length; int M = matrix[0].length; int[] rowRecord = new int[N]; int[] colRecord = new i.原创 2021-08-03 15:57:26 · 52 阅读 · 0 评论 -
第二章:查找与排序(上)
查找与排序递归、查找与排序补充如何评价算法性能相关题解递归、查找与排序补充相关代码:package com.DJL.Recursion;import java.util.Arrays;public class 递归 { //求阶乘 /* 找重复:n*(n-1)的阶乘 找变化:变化的量作为参数 找边界:出口 */ static int f1(int n) { if (n == 1) return 1;原创 2021-05-23 18:53:57 · 68 阅读 · 0 评论 -
第一章:位运算
位运算原创 2021-05-16 17:17:31 · 63 阅读 · 0 评论 -
数论相关算法
数论相关巧用进制Nim游戏必备求和公式欧几里得算法及其扩展模运算素数快速幂运算巧用进制题目描述:题解:import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Practice_巧用进制解决天平问题 { public static void main(String[] args) { Scanner in = new Scanner(System.i原创 2021-07-29 19:52:34 · 102 阅读 · 0 评论 -
最短摘要(尺取法)
题目描述:题目:给定一段产品的英文描述,包含M个英文单词,每个单词以空格分隔,无其他标点,再给定N个英文单词关键字。请说明思路并编程实现方法 String extractSummary(String description,String [ ] Keywords):目标是找出此产品描述中包含N个关键词(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出,编程语言不限。题解:import java.util.Arrays;//阿里巴巴笔试题目public class Practice_最短原创 2021-07-29 09:32:49 · 98 阅读 · 0 评论 -
希尔排序算法
定义:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止算法模版:import java.util.Arrays;public class 希尔排序 { static void shellSort(int[] arr) { int temp = 0; for (int gap = arr.length / 2; gap > 0; gap /=原创 2021-07-25 10:50:23 · 54 阅读 · 0 评论 -
堆排序算法
算法模版:import java.util.Arrays;public class 堆排序 { static int[] arr; //堆调整 static void Sift(int k, int last) { int i, j, temp; i = k; j = 2 * i + 1; while (j <= last) { if (j < last && a原创 2021-07-25 10:48:38 · 52 阅读 · 0 评论 -
插入排序算法
定义:插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。算法模版:import java.util.Arrays;public class 插入排序 { static void insertSort(int[] arr) { i原创 2021-07-25 10:46:57 · 46 阅读 · 0 评论 -
数字三角形_动态规划
题目链接:数字三角形题解:以下提供了四种解法:非记忆型递归记忆型递归dp数组(二维)dp数组(一维)import java.util.Arrays;//POJ1163public class Practice_数字三角形 { static int[][] arr= { {7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4},原创 2021-07-25 10:40:37 · 56 阅读 · 0 评论 -
最长上升子序列问题_动态规划
问题描述:题解:public class Practice_最长上升子序列问题 { public static void main(String[] args) { int[] arr = {4, 3, 2, 5, 6}; int[] dp = new int[arr.length]; System.out.println(dp1(arr, dp)); System.out.println(f(arr)); }原创 2021-07-25 10:35:03 · 62 阅读 · 0 评论 -
最长公共子序列问题_动态规划
问题描述:题解:public class Practice_最长公共子序列问题 { public static void main(String[] args) { //以下面两个字符串为例 String s1 = "sadstory"; String s2 = "adminsorry"; System.out.println(s1 + "与" + s2 + "的最长公共子序列长度为:" + dp(s1, s2)); }原创 2021-07-25 10:31:59 · 63 阅读 · 0 评论 -
钢条切割问题_动态规划
题目描述:题解:import java.util.Arrays;public class Practice_钢条切割 { static int[] p = {1,5,8,16,10,17,17,20,24,30}; static int n=10; static int[] rec = new int[n+1];//记录表 static int[] vc = new int[n+1];//dp表 public static void main(String[]原创 2021-07-25 10:29:40 · 130 阅读 · 0 评论 -
01背包问题_动态规划
题目描述:下面提供了三种解法:(1)无记忆性递归(2)有记忆性递归(3)动态规划三种解法全部放在了一个代码片里面public class Practice_01背包问题 { static int[] w = {2, 1, 3, 2};//重量表 static int[] v = {3, 2, 4, 2};//价值表 static int n = 4;//物品数量 static int W = 5;//背包的称重极限 static int[][] rec;原创 2021-07-23 15:54:01 · 56 阅读 · 0 评论 -
贪心算法小结
原创 2021-07-23 10:23:59 · 51 阅读 · 0 评论 -
乘船问题(贪心策略)
题解:import java.util.Arrays;public class Practice_乘船问题 { public static void main(String[] args) { int[] w = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int C = 10;//每一艘船最大承重量 Arrays.sort(w); int cntOfPerson = w.length;//剩余的人的数量.原创 2021-07-23 10:21:44 · 231 阅读 · 0 评论 -
部分背包问题(贪心策略)
题解:import java.util.Arrays;public class Practice_部分背包问题 { public static void main(String[] args) { int[] w = {1,2,3,4,5}; int[] v = {3,4,3,1,4}; int n = w.length; int C = 10; Obj[] objs = new Obj[n]; for(in.原创 2021-07-23 10:20:08 · 80 阅读 · 0 评论 -
字典序最小问题(贪心策略)
题目链接:POJ3617题解:import java.util.Scanner;public class Practice_字典序最小问题 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); StringBuilder ss = new StringBuilder(); for原创 2021-07-23 09:49:13 · 85 阅读 · 0 评论 -
区间覆盖问题(贪心策略)
题目链接为:POJ3617题解:import java.util.Arrays;import java.util.Scanner;public class Practice_区间覆盖问题 { public static void main(String[] args) {/*输入测试样例:3 101 73 66 10*/ Scanner in = new Scanner(System.in); int N = in.nextInt();//牛原创 2021-07-23 09:45:45 · 89 阅读 · 0 评论 -
Dijkstra算法模版
import java.util.Arrays;import java.util.Scanner;//迪杰斯特拉算法模版public class DijkstraMain { static Scanner in = new Scanner(System.in); static int[] dis = new int[505];//表示起点到某点的最短距离 static boolean[] vis = new boolean[505];//判断某点是否被访问 st原创 2021-07-22 16:57:13 · 82 阅读 · 0 评论 -
prim算法模版
import java.util.Arrays;import java.util.Scanner;//最小生成树算法模版public class primMain { static Scanner in = new Scanner(System.in); static boolean[] vis = new boolean[1005]; static int[] dis = new int[1005]; static int[][] e = new int[1005][原创 2021-07-22 16:54:45 · 75 阅读 · 0 评论 -
单点最短路径_BFS
单点最短路径概念:给定一幅图和一个起点s,回答"从s到给定目的顶点v是否存在一条路径",如果有找出最短的那一条(所含边数最少)等类似的问题import java.util.*;//以一个实际的图案例来使用广度优先搜索查找图中的路径(路径最短)public class test1 { static int n = 6; static int[] edgeTo = new int[n]; static int[][] map = new int[n][n];原创 2021-07-22 16:53:07 · 126 阅读 · 0 评论 -
BFS模版
import java.util.LinkedList;import java.util.Queue;//图的广度优先遍历算法模版public class bfsMain { static boolean[] vis = new boolean[1001]; static int[][] map = new int[1001][1001]; static int n; static void bfs(int v) { Queue<Integ原创 2021-07-22 16:51:09 · 32 阅读 · 0 评论 -
硬币支付问题(贪心策略)
例题:硬币支付问题题解:import java.util.Scanner;public class Practice_硬币支付问题 { static int[] cnt = new int[6]; static int[] coins = {1, 5, 10, 50, 100, 500}; public static void main(String[] args) { /* 输入测试样例: 3 2 1 ..原创 2021-07-21 09:33:05 · 124 阅读 · 0 评论 -
区间选点问题(贪心策略)
这是北大OJ的一道题目题目的大致意思是,给定n个闭区间,并且这个闭区间上的点都是整数,现在要求你使用最少的点来覆盖这些区间并且每个区间的覆盖的点的数量满足输入的要求点覆盖区间的数量。输入:第一行输入n,代表n个区间。接下来的n行每行的第一个数代表区间起点,第二个数代表区间终点,第三个数代表这个区间必须要选取的点的数量。输出:输出最少的点的数量,这些最少的点要覆盖全部区间。这个题是区间选点问题的一种变体,但是我们对于区间选点问题清楚之后那么这种题目也是一样解决的,只不过需要在某些地方特别处理一.原创 2021-07-21 12:29:24 · 330 阅读 · 0 评论 -
区间调度问题(贪心策略)
题解:import java.util.Arrays;import java.util.Scanner;public class Practice_区间调度问题 { public static void main(String[] args) { /* 输入测试样例: 5 1 2 4 6 8 3 5 7 9 10 */ Scanner in = ne.原创 2021-07-21 10:35:25 · 118 阅读 · 0 评论 -
给两个序列构造一颗二叉树(java)
给两个序列构造一棵二叉树从前序与中序遍历序列构建二叉树代码实现从后序与中序遍历序列构建二叉树代码实现从前序与中序遍历序列构建二叉树代码实现package com.DJL.tree;import java.util.HashMap;import java.util.Map;import java.util.Scanner;/** * @author DJL * @create 2021-04-09 22:16 *///从前序与中序遍历序列构建二叉树public class Bin原创 2021-04-10 10:59:16 · 207 阅读 · 0 评论