![](https://img-blog.csdnimg.cn/20200516105238649.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
一些简单算法
Hai-Yang-code
这个作者很懒,什么都没留下…
展开
-
递归-八皇后问题(回溯算法)
八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解原创 2020-07-12 11:42:50 · 226 阅读 · 0 评论 -
约瑟夫环问题
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。package c原创 2020-07-08 21:17:07 · 310 阅读 · 0 评论 -
带头节点的单向链表反转
package com.qcby.bilbil;/** * @author HuangHaiyang * @date 2020/07/08 * @description: description * @version: 1.0.0 */public class ReversalList { private Node head=new Node(0,null);//带头节点 private Integer size=0; public void add(Node原创 2020-07-08 16:52:01 · 267 阅读 · 0 评论 -
二维数组转为稀疏数组再复原
package com.qcby.bilbil;/** * @author HuangHaiyang * @date 2020/07/01 * @description: description * @version: 1.0.0 */public class SparseArray { public static void main(String[] args) { //原始数组 int[][] originalArray=new int [...原创 2020-07-01 20:47:29 · 129 阅读 · 0 评论 -
贪心算法之最优装载问题
在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海(Caribbean Sea)。17 世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国皇家舰…有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值。虽然海盗船足够大,但载重量为C,每件古董的重量为wi,海盗们该如何把尽可能多数量的宝贝装.上海盗船呢?问题分析根据问题描述可知这是-一个可以用贪心算法求解的原创 2020-05-24 15:18:21 · 1966 阅读 · 1 评论 -
算法学习之贪心算法
贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案------------《算法导论》从问题的初始解开始,一步一步地做出当前最好的选择,逐步逼近问题的目标,尽可能地得到最优解,即使达不到最优解,也可以得到最优解的近似解我们需要注意一下几个问题一旦做出选择,不可以后悔又可能得到的不是最优解,而是最优解的近似解选择什么样的贪心策略,直接决定算法的好坏什么样的问题可以使用贪心算法具有贪心选择性质- 原问题的整体最优解可以通过一系列的局部最优的选择得到原创 2020-05-24 14:49:06 · 341 阅读 · 0 评论 -
八大排序之归并排序
归并排序采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。核心思想是分治1.先是两个一组,组内有序2.第二次,取两个组,**比较头部,**小的放进来,原属组删除,在比较新的头,注意不是两个头比较了按序进两个,而是只进一个直到有一个组空,直接加进来这样就是每趟组合排序复杂度是O(N),有log N趟,第一趟分原创 2020-05-21 20:20:53 · 1518 阅读 · 0 评论 -
八大排序之堆排序
堆排序小根堆,和大根堆都是一棵完全数(除了最后一排都是满的,最后一排的叶子节点从最左段开始插入)小根堆,每个节点都比它的左右子树的节点要小大根堆,每个节点都比它的左右子树的节点要大过程先构建一个小(大)根堆,每次新建的节点都要和父节点比较,要比父节点小,交换位置,直到比较到根节点,构建完成后再取根节点,再把整个堆的最后一个结点放到根节点的位置,调整整个堆为小(大)顶堆,再取根节点,。。。最后形成一个有序数组,== 小顶堆构建一个升序序列 大顶堆构建一个降序序列==...原创 2020-05-20 22:17:05 · 203 阅读 · 0 评论 -
八大排序之快速排序
快速排序选取一个基准数,每次排序,比它小的都在左边,比它大的都在右边分别对左右两部分进行快速排序直到整个数组有序package com.qcby.sort;public class Quick { public static void main(String[] args) { int[] x = {12, 20, 5, 16, 15, 10, 30, 45}; sort(x, 0, x.length - 1); for (int i原创 2020-05-20 21:38:29 · 213 阅读 · 0 评论 -
八大排序之插入排序
插入排序插入排序原理很简单,讲一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。package com.qcby.sort;import java.util.ArrayList;import java.util.List;public class Insert { publi原创 2020-05-20 21:06:50 · 160 阅读 · 0 评论 -
八大排序之选择排序
选择排序在未排序序列中找到最小(大)元素,与当前序列起始位置的数交换位置从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。package com.qcby.sort;public class Select { public static void main(String[] args) { int[] nums = new int[]{53, 56, 24, 86, 45, 41, 78, 12, 10, 50,原创 2020-05-20 21:00:48 · 137 阅读 · 0 评论 -
八大排序之冒泡排序
冒泡排序它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。(2)比较第2和第3个数,将小数 放在前面,大数放在后面。…(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成原创 2020-05-20 20:52:29 · 197 阅读 · 0 评论 -
由中序遍历和后序遍历 输出先序遍历
由中序遍历和后序遍历 输出先序遍历public static void main(String[] args) { Scanner input=new Scanner(System.in); String mid=input.nextLine(); String next=input.nextLine(); System.out.p...原创 2020-05-07 12:33:36 · 631 阅读 · 0 评论 -
给定一个字符串,请输出该字符串由哪些字符组成,每个字符出现几次?
给定一个字符串,请输出该字符串由哪些字符组成,每个字符出现几次?for (int i = 0; i < firStr.length(); i++) { if (firStr.indexOf(firStr.charAt(i)) == i) { //当这个字符第一次出现的位置和 当前的位置相同时 ,说明它第一次出现, int count ...原创 2020-05-07 12:31:07 · 677 阅读 · 0 评论 -
给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置.
给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置.如:"abcd23abc34bcd"中,"bc"子串的出现位置为: 1,7,11.字符串和子串均由用户输入```javaScanner scanner=new Scanner(System.in); System.out.println("输入字符串1"); String fi...原创 2020-05-07 12:28:43 · 3378 阅读 · 1 评论 -
冬冬爬楼梯,一步可以1级,也可以爬2级、3级。冬冬很可爱,每到一处楼梯处,他都想知道直完这个楼梯有多少种走法。但由于有的时候楼梯级数太多,可能是个天文数字,很显然,对于还处于小学5年级的冬冬是不太现实
冬冬爬楼梯,一步可以1级,也可以爬2级、3级。冬冬很可爱,每到一处楼梯处,他都想知道直完这个楼梯有多少种走法。但由于有的时候楼梯级数太多,可能是个天文数字,很显然,对于还处于小学5年级的冬冬是不太现实多笔测资,每笔测资一行:整数n (1<=n<=3000)对第笔测资,输出一个整数,为n级楼梯冬冬走完的方法数。输入123输出124当n>=4时, 它前一个的位...原创 2020-05-07 22:35:08 · 2233 阅读 · 0 评论