
基础算法与实际问题
剖析基础算法,或通过解决实际问题来理解算法。
nZk丶
这个作者很懒,什么都没留下…
展开
-
合并两个有序链表(递归)--java实现
问题:代码:class ListNode{ int val; ListNode next; ListNode(int x){ val = x; }}public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode原创 2020-07-29 12:19:05 · 596 阅读 · 0 评论 -
矩阵最小路径和-动态规划(Java实现)
问题描述:有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.测试样例:[[1,2,3],[1,1,1]],2,3返回:4代码及思路:public class shortestWay { public static int minPathSum(int [][]m){原创 2020-07-20 18:10:18 · 659 阅读 · 0 评论 -
N后问题详解(回溯法)--Java实现
目录一.问题描述二.求解思路三.代码实现一.问题描述N皇后问题:在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?二.求解思路运用回溯法形成解空间树来求解该问题。下面给出一个3后的解空间树:核心算法(具体怎么判断新加入的皇后和之前的皇后冲突与否):由于N皇后问题不允许两个皇后在同一行,所以,可用一维数组X表示N皇后问题的解,i表示当前规划的皇后在第几行,X[i]表示第i行的皇...原创 2020-06-20 13:57:01 · 2081 阅读 · 1 评论 -
并查集_数据结构--java实现
一.定义简而言之就是有“合并集合”和“查找集合中的元素”两种操作的关于数据结构的一种算法。连接两个对象 判断是否这两个对象是连接的上例中,0,7是没有路径的;8,9之间有一条可达路径,因此就算是连接的。(学过图论的人应该不难理解)二.数学模型等价性: p连接到p,每个对象都能连接到自己 对称性: p连接到q;等价于q连接到p 传递性: 如果p连接到q,q连接到r,那么,p连接到r。三.快速查找1.数据结构这里用到的数据结构是数组。对象索引整数数组,用索引来表示N个.原创 2020-06-06 17:49:54 · 258 阅读 · 0 评论 -
0-1背包问题(动态规划)--java实现
动态规划适用动态规划的问题必须满足最优化原理、无后效性和重叠性。 1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。 2.无后效性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过原创 2020-05-30 11:19:27 · 1367 阅读 · 0 评论 -
非递归实现归并排序--Java实现
非递归实现归并排序的划分函数Merge和递归的归并排序是一样的,但是使用了一种较为巧妙的方法来代替递归过程,具体过程都注释在代码中了,代码如下:/** * 非递归实现归并排序 */public class NiceMergeSort { //划分函数,一定程度上的排序,并排不完,需要递归调用来完成归并排序,相当于把问题分而治之 public static void Merge(int []dsi,int []src,int left ,int m, int right)原创 2020-05-27 09:11:21 · 408 阅读 · 0 评论 -
输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。
举个例子,就像是{0,-2,3,10,-4,7,2}这个数组,有最大值的子数组就是{3,10,-4,7,2},和自然为18。拿到这个问题时,可能我们第一反应是以每个元素为数组的首元素,先通过遍历创建多个数组,再求和比较,这样也没错,也最容易想到。但是这时如果要求你的算法时间复杂度为O(n)呢?我们就无法写两层for循环嵌套了,此时就要动动小脑瓜了。光说大家可能不太好理解,我将主要思路注释在代...原创 2019-10-28 20:29:00 · 4895 阅读 · 2 评论 -
判断一颗二叉树是否是完全二叉树--java实现
完全二叉树:对于一个树高为h的二叉树,如果其第0层至第h-1层的节点都满。如果最下面一层节点不满,则所有的节点在左边的连续排列,空位都在右边。这样的二叉树就是一棵完全二叉树。思路:任何一个结点如果右孩子不为空,左孩子却是空,则一定不是完全二叉树 当一个结点出现右孩子为空时候,判断该结点的层次遍历后继结点是否为叶子节点,如果全部都是叶子节点,则是完全二叉树,如果存在任何一个结点不是叶...原创 2020-03-21 18:16:40 · 739 阅读 · 1 评论 -
快速排序详解--java实现
高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放...原创 2020-03-18 11:51:23 · 292 阅读 · 0 评论 -
归并排序--Java实现
思想:归并排序是利用归并的思想实现的排序方法,采用分治策略,将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。再详细看一下治阶段的详细操作:比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],是如下图这般的步骤实现的:这里我们用递归来实现代...原创 2020-03-11 21:11:00 · 143 阅读 · 1 评论 -
寻找旋转排序数组中的最小值 leetcode--Java实现
问题描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7]在4处旋转可变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1-------------------------------------------示例 2:输...原创 2020-03-07 20:35:26 · 181 阅读 · 0 评论 -
Java--链表中环的入口节点(两种方法实现)
方法1思路:设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。以下是两个结论证明:两个结论:1、设置快慢指针,假如有环,他们最后一定相遇。2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。证明结论...原创 2020-02-10 11:53:28 · 1095 阅读 · 3 评论 -
反转单链表-Java实现
今天突然有一位同学问我反转单链表到底是怎么实现的,说是代码他理解不了,不理解其中的过程。我看了看各个论坛大神们的讲解,是没什么问题,只是可能在不同知识层面的人,理解起来需要一个过程。下面我用最傻瓜最详细的分析来说说这个反转单链表到底是怎么回事。先上一下代码:public static Node reverseList(Node node) { Node pre = null;...原创 2020-02-01 14:12:14 · 189 阅读 · 0 评论 -
贪吃的小Q--java实现
问题描述小Q的父母要出差N天,走之前给小Q留下了M块奶糖。小Q决定每天吃的奶糖数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有奶糖吃,请问他第一天最多能吃多少块奶糖?输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。输出描述:输出一个数...原创 2020-03-07 20:03:28 · 445 阅读 · 0 评论