![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法练习
徒手劈西瓜
这个作者很懒,什么都没留下…
展开
-
地图搜索(多源广度优先搜索)
题目你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆地区域的距离。我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0...原创 2020-03-29 23:40:32 · 680 阅读 · 0 评论 -
单词的压缩编码(字典树)
字典树基本解释字典树又名前缀树,也叫Trie,字典树用户存储大量的字符串,相比HashMap的存储,字典树节省了大量的空间。如下图:(截图来自LeetCode)可以发现,令字典树的根节点为空,从根节点走到叶子节点,每一条路径都会构成一个单词,比如最左边的路径可以构成单词"to",最右边的路径可以构成单词"inn",当然如果不到根节点,也可以构成一个单词,比如最右边的"in",同时也可以发现...原创 2020-03-28 14:30:46 · 919 阅读 · 0 评论 -
回文子串类问题(回文子串数及最长回文子串)
问题一给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。实例输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".方法一可以发现,回文串特点就是每个回文串都有一个中心点,左右边是对称的,那么我们就可以以中心点为基点,向两边扩散遍历,如果左右的字符相等,那么,就可以...原创 2020-03-25 14:42:36 · 674 阅读 · 0 评论 -
使序列递增的最小交换次数
题目我们有两个长度相等且不为空的整型数组 A 和 B 。我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < … < A[A.length - 1])。给定数组 A 和 B ,请返回使得两个数组均保持严格...原创 2020-03-03 16:37:02 · 893 阅读 · 0 评论 -
leetCode-考场就座
一.题目在考场里,一排有N个座位,分别编号为0, 1, 2, ..., N-1。当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 号座位上。)返回ExamRoom(int N)类,它有两个公开的函数:其中,函数ExamRoom.seat()会返回一...原创 2019-11-13 09:44:35 · 673 阅读 · 0 评论 -
排序算法-归并排序
一.归并排序基本思路归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二.归并排序图解(转载)https://www.2cto.com/kf/201611/...原创 2019-10-06 21:48:35 · 125 阅读 · 0 评论 -
排序算法-快速排序
一.快速排序的基本原理快速排序分为以下几步:第一步:在数组中任意选取一个数作为基准数(pivot)第二步:通过处理,将数组中大于基准数的数都放在基准数的右边,小于基准数的数都放在基准数的左边。第三步:通过第二步,对基准数的左右两边再重复第一步和第二步的操作,不断重复,直到区间里只剩下一个或者没有元素为止。二.快速排序图解三.快速排序代码(Java)import ...原创 2019-10-05 23:59:14 · 145 阅读 · 0 评论 -
排序算法-冒泡排序
一.冒泡排序基本原理在无序区间中,通过相邻的数进行比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序。二.冒泡排序图解三.冒泡排序代码(Java)import java.util.Arrays;public class BubbleSort { public static void main(String[] args) { i...原创 2019-10-04 22:48:49 · 98 阅读 · 0 评论 -
排序算法-堆排序
一.堆排序基本原理堆排序实质上也是选择排序,即在无序区间选出最大的值放入到无序区间中,只是直接选择排序是通过循环无序区间来查找最大的元素,而堆排序是通过将无序区间建堆的方式来找出最大的元素,放入到有序区间中。二.堆排序代码(Java)import java.util.ArrayList;import java.util.Arrays;public class HeapSort...原创 2019-10-04 22:05:16 · 74 阅读 · 0 评论 -
排序算法-选择排序
一.选择排序基本思路选择排序的基本方法分为以下几步:第一步:将所需排序的区间分为有序区间和无序区间第二步:从无序区间中选出一个最大(最小)的元素,存放在无序区间的最后(或最前)第三步:遍历无序区间的所有元素,重复第二步,直到无序区间的元素全部插入到有序区间中,排序结束。该排序算法较简单 图解略二.选择排序代码(Java)import java.util.ArrayLi...原创 2019-10-03 23:24:37 · 106 阅读 · 0 评论 -
排序算法-希尔排序
一.希尔排序的基本思路希尔排序实质上是对直接插入排序算法的一种优化,希尔排序又称为缩小增量法排序基本思路:首先设置一个基准距离,将一个数组按基准距离分成若干个组,并对每一个组内的记录进行直接插入排序。然后不断缩小基准距离,重复上述分组和排序步骤,当基准距离等于1 的时,进行最后一次直接插入排序,而后排序结束。原理:当基准距离大于1时,都是在尽可能的让数组更快的接近有序,当基准距离等于1...原创 2019-10-03 22:46:48 · 94 阅读 · 0 评论 -
排序算法-直接插入排序
一.插入排序基本思路直接插入排序的基本方法分为以下几步:第一步:将所需排序的区间分为有序区间和无序区间第二步:从无序区间中取出一个元素,将其与有序区间的元素依次进行比较,找到合适的位置进行插入,使得有序区间依然有序第三步:遍历无序区间的所有元素,重复第二步,直到无序区间的元素全部插入到有序区间中,排序结束。二.插入排序图示三.直接插入排序代码(Java)impo...原创 2019-10-03 20:59:31 · 263 阅读 · 0 评论 -
LeetCode-用队列实现栈
一.题目使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。你所使用的语言也许不支持队列。你可以使用 l...原创 2019-08-05 17:41:49 · 110 阅读 · 0 评论 -
LeetCode-有效的括号
一.题目给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。二.示例示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: fa...原创 2019-08-05 16:33:04 · 74 阅读 · 0 评论 -
LeetCode-复制带随机指针的链表
一.题目给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。二.输入输出示例输入:{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}解释:节点 1 的值是 ...原创 2019-08-04 15:04:32 · 61 阅读 · 0 评论 -
LeetCode_两数相除
题目给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。示例 1:输入: dividend = 10, divisor = 3输出: 3示例 2:输入: dividend = 7, divisor = -3输出: -2思路:思路1:通过循环用除...原创 2019-06-16 13:22:50 · 271 阅读 · 0 评论