![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
赫敏格兰杰
这个作者很懒,什么都没留下…
展开
-
递归求解数独(回溯思想)[Java]
需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复row == 0 标记第一行;从第一个空格出发,依次从1-9尝试填数字,填完后填下一个空,若下一个空格1-9都不行,则返回上一格尝试另一个数字,直到row为9则说明八行都填完了,则输出,同时再返回上一格尝试其他数字,直到第一个空格所有数字都试过了结束。package p4.分治回溯;import java.io.*;//数独public class Sudoku {.原创 2022-01-21 11:18:40 · 490 阅读 · 0 评论 -
递归八皇后问题[Java]
思路:用row==0标记第一行,先确定第一行的皇后位置,再row + 1依次确定下一行的皇后位置。如果row == 9则说明八行皇后位置都摆放好了,则输出,同时返回上一行继续尝试其他位置,直到第一行的皇后所有列都试过;如果row != 9 且下一行皇后每个位置都放不了,则返回上一行把皇后向后移,依次尝试。package p4.分治回溯;//N个皇后问题public class NQueen { private static int count; //记录有几种可能 priva...原创 2022-01-21 09:51:37 · 405 阅读 · 0 评论 -
迭代解决迷宫问题[Java]
从起点开始,代码中方向优先级是上右下左,当此方向为路且没有被走过时,则向这方向下一个点走,并入栈(记录路径),若走到某个点四个方向都不能走时,则弹栈此点并返回,直到前面某点可以走另外的方向,走到终点时输出路径,若一直返回到起点并四个方向都不能走了,则迷宫不通。package p4.分治回溯;import p3.链式结构.LinkedList;public class Maze { private static int[][] maze = { {1, 1, 1, 1原创 2022-01-20 22:25:53 · 237 阅读 · 0 评论 -
棋盘覆盖问题[Java]
当四等分后为2*2的棋盘且特殊方格在其中,则刚好用一个L填满棋盘。解题思路:先将棋盘按中间点四等分为左上,右上,左下,右下四部分。当四等分后为2*2的棋盘且特殊方格在其中,则刚好用一个L填满棋盘。若四等分后特殊方格不在其中,则将中心四格除了特殊方格在的部分其他三个格子涂同一颜色,并标记为特殊方格。//棋盘覆盖问题public class ChessBoardCoverage { private static int BOARD_SIZE = 4;//例举4*4的棋盘 pr...原创 2022-01-20 22:03:11 · 718 阅读 · 0 评论 -
递归解决汉诺塔问题[Java]
核心思想:前n个要从起点到终点,那要先把前n-1个移到第三点,然后第n个点移到终点,最后前n-1个点从第三点移到终点。(我在a要去c,先把我前面的都移到b,然后我去a,最后n-1个再来c)例如:第n个要a→c:先让前n-1个都a→b,然后第n个再a→c,最后前n-1个再b→c。 其中前n-1个要a→b:让前n-2个都a→c,第n-1个a→b,前n-2再c→b,以此直到前面只有一个盘子则直接移动再返回。//移盘子//第n个在a要去c,先让前n-1个都去b,然后第n个再去a,最后前n-1个再来c//.原创 2022-01-20 17:34:29 · 80 阅读 · 0 评论 -
递归 遍历文件夹[Java]
遍历时遇到文件时打印,遇到文件夹则打开,遍历其中内容(遇到文件时打印,遇到文件夹则打开),直到没有嵌套文件夹,再返回打开上一层的第二个文件夹或打印完当层文件夹中所以文件.import java.io.File;//遍历文件夹,类似于深度遍历//(遍历时遇到文件夹则打开,遍历其中内容,直到没有嵌套文件夹,再返回打开上一层的第二个文件夹)public class RecursionDemo05 { public static void main(String[] args) {原创 2022-01-20 17:23:07 · 530 阅读 · 0 评论 -
递归 二分查找
二分查找:表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。//递归方式进行二分查找public class RecursionDemo04 { private static int count = 0;//记录递归了几次 pub.原创 2022-01-20 17:19:29 · 149 阅读 · 0 评论 -
递归求斐波那契数列第n个数
斐波那契数列:第一个和第二个是1,从第三个开始每一项都是前两项的和1 1 2 3 5 8 13 21 34 …求斐波那契数列的第n项,利用递归思想,除了第一、二位,每一位都是前两项的和。递归函数的临界点就是等于1或n等于2,n大于2时便再次调用前n-1和n-2的值然后相加。//斐波那契数列public class RecursionDemo03 { public static void main(String[] args) { int ret = fio(5); //这.原创 2022-01-20 17:14:34 · 2138 阅读 · 0 评论 -
LeedCode142,判断表中是否有环,若有环返回开始进入环的第一个节点[Java]
判断表中是否有环,若有环返回开始进入环的第一个节点通过跑操场套圈的思想,设置两个指针fast每次走两格,slow每次走一格,如果fast后来与slow相遇则说明有环,若fast的next是null则说明是无环。此题只考虑套一圈的情况:设进入环前走的路程是a,slow进入环后被追上时走的路程是b,环中slow还未走的路程是c(b+c是环的长度)则fast追上slow时走的路程是:a+(b+c)+b , slow走的路程是:a+b因为fast的速度是slow的两倍,得出→ 2*(a+b)=a+.原创 2022-01-17 10:56:05 · 136 阅读 · 0 评论 -
LeedCode141,判断链表中是否有环[Java]
判断链表中是否有环通过跑操场套圈的思想,两个指针q快p慢,如果q后来与p相遇则说明有环,若q的next是null则说明是无环。package p3.链式结构;//判断链表中是否有环/*通过跑操场套圈的思想,两个指针q快p慢,如果q后来与p相遇则说明有环,若q的next是null则说明是无环。 */public class Solution141 { public boolean hasCycle(ListNode head) { if(head == null .原创 2022-01-17 10:53:26 · 223 阅读 · 0 评论 -
LeedCode83,去除重复元素,重复的元素留下一个
去除重复元素,重复的元素留下一个定义指针left初始指向head,rigth指向left的下一个。若right指向的结点与left指向的结点相等,则删除该节点同时right向后移一位(right依旧是left的后一位),直到不同。若不同则left和right同时向后移一位。package p3.链式结构;//去除重复元素,重复的元素留下一个/*定义指针left初始指向head,rigth指向left的下一个。若right指向的结点与left指向的结点相等,则删除该节点,同时right.原创 2022-01-17 10:52:02 · 160 阅读 · 0 评论 -
LeedCode82,去除重复元素,元素只要有重复就全去掉[Java]
去除重复元素,元素只要有重复就全去掉设置一个指针dummy,next指向头结点(因为不知道头结点是否需要删除),指针pre指向dummy,cur指向head。如果cur指向的结点和其下一个结点值相同,则设置check指针从cur后两个结点开始向后遍历,直到check指向的结点与cur指向的结点值不同或check指向null(找出所有与cur指向结点相同的结点)然后将pre的next指向check指向的结点,则将cur指向的结点至check指向结点的前一个结点全部删除。再将cur指向check指.原创 2022-01-17 10:50:38 · 267 阅读 · 0 评论 -
LeetCode19,删除倒数第n个结点[Java]
题意:只知道头节点head,删除倒数第n个结点需要找到删除结点的前一结点,可以设置两个结点left、right都指向head,把要从尾结点向前移n位至倒数第n个结点的前一位,转换成rigth从头节点向后移n位,再left和right同时向后移动,那么当right是尾结点时,left则是删除结点的前一位package p3.链式结构;//只知道头节点head,删除倒数第n个结点/*需要找到删除结点的前一结点,可以设置两个结点left、right都指向head,把要从尾结点向前移n位至倒.原创 2022-01-17 10:46:50 · 322 阅读 · 0 评论 -
双向循环链表构建[Java]
双向循环链表构建接口定义双向循环链表构建测试链表功能是否实现双向循环链表:每个结点都有两个指针域,一个指向前一个结点,一个指向后一个结点,且头节点的前一个指向尾结点,尾结点下一个指向头节点,形成循环。构建一个双向循环链表同时实现表,栈,循环队列的功能接口定义创建接口,继承Iterable,E表示类型选择泛型,定义接口中的方法。顺序表接口:package p1.接口;import java.util.Comparator;public interface List<E> e原创 2022-01-17 10:41:19 · 331 阅读 · 0 评论 -
循环链表构建及解决约瑟夫环、逢七过、链表逆置问题
文章目录循环链表构建测试约瑟夫环逢七过链表逆置循环链表构建循环链表与链表区别就在于尾指针不再指向null而是指向头指针,形成环。接口定义:package p1.接口;import java.util.Comparator;public interface List<E> extends Iterable<E> { public void add(E element);//在表尾添加 public void add(int index, E elem原创 2022-01-15 19:39:04 · 202 阅读 · 0 评论 -
单链表构建
单链表接口定义单链表实现测试接口定义单链表和顺序表使用相同接口,在方法实现时顺序表底层是通过数组,单链表通过创建结点类,进行连接。接口方法:package p1.接口;public interface Deque<E> extends Queue<E> { public void addFirst(E element); public void addLast(E element); public E removeFirst(); pub原创 2022-01-15 18:38:43 · 116 阅读 · 0 评论 -
双端队列[Java]
双端队列接口定义双端队列类的实现测试双端队列:队首队尾都可以进行添加和删除,也是循环队列。想象一条横着的、减元素向左加元素向右的顺序表:队首指针front:从队首增加元素时向左移,减少时向右移;队尾指针rear:从队尾增加元素时向右移,减少时向左移;向后时通过 front = (front - 1 + data.length) % data.length;移动指针,向前时通过front = (front+1) % data.length;移动指针(rear也一样)。接口定义先定义双端队列原创 2022-01-14 17:21:09 · 289 阅读 · 0 评论 -
循环队列的构造
定义类ArrayLoopQueue继承Queue接口,Queue接口定义详见队列接口及顺序队列的实现入队移动尾指针rear,出队移动头指针front。通过rear = (rear + 1) % data.length;和front = (front + 1) % data.length;向前移一位,实现当在数组最后一个位置时向前移一位是到第一位。package p2.线性结构;import p1.接口.Queue;import java.util.Iterator;//循环队列public原创 2022-01-14 14:23:19 · 243 阅读 · 0 评论 -
用顺序队列实现栈功能
//创建类继承栈的接口,在类中用队列实现栈的功能方法,Stack接口详见栈接口及顺序栈的实现类中需创建两个顺序栈的对象,ArrayQueue类见队列的接口及顺序队列的实现入栈:和入队一样都是从尾入。出栈:出栈时因为栈要出的实际是队列的最后一个,所以将除了队尾的元素都入队到第二个队列,再将队尾弹出即是出栈的元素;而其他元素出队到第二个队列时顺序不变,所以出栈完成。查看队首:和出队相同原理因为不知道元素在第一个队列还是第二个队列,所以进行操作前要先进行判空,判断元素在哪个队列。package p.原创 2022-01-14 14:04:12 · 117 阅读 · 0 评论 -
用栈实现队列功能
//创建类继承队列的接口,在类中用栈实现队列的功能方法,Queue接口详见第队列接口及顺序队列的实现类中需创建两个顺序栈的对象,ArrayStack类见顺序栈接口定义及顺序栈的实现入队:和入栈一样都是从尾入。出队:出栈时因为队列要出的实际是栈的最后一个,所以将除了栈底的元素都入栈到第二个栈,再将栈底弹出即是出队的元素;又因为其他元素转移时栈顶在第二个栈成了栈底,所以需将元素重新入栈到第一个栈,出队才算结束。查看队首:和出队相同原理package p2.线性结构;import p1.接口.Q.原创 2022-01-14 13:49:31 · 219 阅读 · 0 评论 -
顺序表实现双端栈
双端栈双端栈结构实现测试双端栈代码双端栈结构实现双端栈:将一个线性表两端都当作栈底进行入栈出栈。可以理解成线性表两端各自向中间增减元素。左栈栈顶指针初始值:ltop==-1,左栈元素个数:ltop+1;ltop同等于左栈最后一个元素所在的位置。右栈栈顶指针初始值:rtop== length,右栈元素个数:length-rtop;rtop同等于右栈最后一个元素所在的位置。栈满:ltop+1==rtoppackage p2.线性结构;import java.util.Iterator;//原创 2022-01-14 13:17:31 · 141 阅读 · 0 评论 -
顺序队列实现遍历文件夹[Java]
遍历文件夹先将要遍历的文件夹入队当队不为空,则出队一个文件夹打印,然后展开遍历,若为文件则打印,若为文件夹则入队,直到队列为空。代码示例package p2.线性结构;import java.io.File;public class DirectoryTraversal { public static void main(String[] args) { File dir = new File("C:\\Users\\86138\\Desktop\\DS");原创 2022-01-13 13:40:55 · 237 阅读 · 0 评论 -
队列接口及顺序队列的实现
队列接口及顺序队列接口定义队列实现接口定义在新建类时选择接口并继承Iterable,E表示泛型。package p1.接口;public interface Queue<E> extends Iterable<E> { public void offer(E element); //入队 public E poll(); //出队 public E peek(); //查看队头元素 public boolean isEmpty();原创 2022-01-13 13:39:38 · 166 阅读 · 0 评论 -
括号匹配[Java]
顺序栈实现括号匹配差值比较利用HashMap源代码差值比较利用’(’ - ‘)’ 的值是-1,’[’ - ‘]’、’{’ - '}'等的值是-2来判断是否匹配思路:遍历字符串,若栈为空,或栈顶元素与遍历到的当前元素不匹配则入栈,匹配则弹栈(弹栈后遍历的当前元素不入栈)。若遍历结束后栈为空,则说明括号都匹配上了。private static void solution01() { String str = "{()[[()]]<>{}()<>}()";原创 2022-01-13 10:10:08 · 1228 阅读 · 0 评论 -
判断回文串[Java]
判断回文串利用顺序栈方法1顺序栈方法2双指针源代码利用顺序栈方法1思路:先将字符串的前一半进栈,然后再顺序遍历后一半,如果不同则直接退出,相同则弹栈继续比较下一个,若遍历结束后栈为空则说明每一位都匹配上了,说明是回文。private static void method1(){ String s = "123456"; ArrayStack<Character> stack = new ArrayStack<>(); for (i原创 2022-01-12 17:37:22 · 612 阅读 · 0 评论 -
顺序栈实现十进制和十六进制转换[java]
顺序栈实现十进制和十六进制转换[java]十进制转十六进制十六进制转十进制十进制转十六进制创建一个String类型的顺序栈,存放数字和字符十进制除16取余,余数若小于10则直接进栈;若大于10,通过(char)(余数+55)转成字母(char)(65)是A除尽后定义一个字符串接收栈的出栈,并输出package p2.线性结构;//顺序栈十进制转十六进制public class DecToHex { public static void main(String[] args) {原创 2022-01-12 15:34:57 · 1278 阅读 · 0 评论 -
前缀表达式转后缀表达式,及后缀表达式计算器
前缀表达式转后缀表达式,及后缀表达式计算器[Java]前缀表达式转后缀表达式前缀表达式转后缀表达式总体思路:创建一个字符型的顺序栈栈和字符型的顺序表存放数字和运算符(顺序表和顺序栈创建参考1,2篇)。将表达式符号两边插入空格(分割时就不会10分成1,0)后按空格分割。遍历分割后的表达式:若遍历到数字则直接进顺序表;若为运算符则先判断,栈若为空或栈顶是左括号或栈顶运算符优先级低于遍历到的运算符,则进栈,否则先栈内运算符出栈至顺序表直到满足进栈条件;若为左括号则直接进栈;若为右括号则栈内运算符一直原创 2022-01-12 13:47:26 · 1063 阅读 · 0 评论