算法
总结一些算法
小森、
这个作者很懒,什么都没留下…
展开
-
滑动窗口问题
目录1.最小覆盖子串1.最小覆盖子串描述给出两个字符串 SS 和 TT,要求在O(n)O(n)的时间复杂度内在 SS 中找出最短的包含 TT 中所有字符的子串。例如:S ="XDOYEZODEYXNZ"S=“XDOYEZODEYXNZ”T =“XYZ"T=“XYZ”找出的最短子串为"YXNZ”“YXNZ”.注意:如果 SS 中没有包含 TT 中所有字符的子串,返回空字符串 “”;满足条件的子串可能有很多,但是题目保证满足条件的最短的子串唯一。import java.util.*;原创 2021-07-29 09:54:25 · 127 阅读 · 0 评论 -
全排列问题
目录1.字符串的全排列1.字符串的全排列包含重复字符,以任意顺序返回这个字符串列表import java.util.*;public class Solution { ArrayList<String> res=new ArrayList<>(); char[] c; public ArrayList<String> Permutation(String str) { c=str.toCharArray();原创 2021-07-20 09:49:33 · 69 阅读 · 0 评论 -
TopK问题总结
目录总结1.寻找第K大2.最小的K个数总结一般有三种解法,排序、堆、快排思想1.寻找第K大描述: 给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。import java.util.*;public class Solution { public int findKth(int[] a, int n, int K) { // write code here retu原创 2021-07-07 09:39:25 · 87 阅读 · 0 评论 -
LeetCode 1584. 连接所有点的最小费用(Kruskal 算法、并查集)
题目:给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。示例一:输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]输出:20解释:原创 2021-01-20 20:21:32 · 213 阅读 · 0 评论 -
LeetCode 225. 用队列实现栈---Java题解
思路:Queue的特性是先进先出Stack的特性是先进后出如何让进入Queue的数据后出呢?反转整条队列,也就是每进入一个数据,对整个队列进行反转如何反转?1.使用另一个队列辅助反转2.原地反转使用另一个队列辅助反转class MyStack { /** Initialize your data structure here. */ //outQueue作为辅助队列,同时保存已经反转好的队列 private Queue<Integer> inQu原创 2020-12-14 10:54:19 · 71 阅读 · 0 评论 -
LeetCode 215. 数组中的第K个最大元素---Java(优先队列、快速排序)
题目:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。一般求解第K大或第K小的问题都可以通过快排和优先队列(最小堆、最大堆)来解决。方法1:使用快速排序进行分治众所周知,每次快排都可以固定某个元原创 2020-12-05 17:36:47 · 294 阅读 · 0 评论 -
LeetCode 44. 通配符匹配---Java题解
题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s可能为空,且只包含从 a-z 的小写字母。p可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *示例:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。输入:s = "aa"p = "*"输出:原创 2020-11-30 12:27:19 · 165 阅读 · 0 评论 -
LeetCode 127. 单词接龙---Java题解
题目:给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:1.每次转换只能改变一个字母。2.转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例1:输入:beginWord = "hit",endW原创 2020-11-26 20:22:55 · 298 阅读 · 0 评论 -
LeetCode 50. Pow(x, n)---Java题解
题目: 实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例输入: 2.00000, 10输出: 1024.00000输入: 2.10000, 3输出: 9.26100输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25解题思路:快速幂快速幂应用的是分治的思想基本原理:xn = (x2)n//2 (n为偶数)xn = x*(x2)n//2 (n为奇数)根据推导,可以通过x=x2把幂次从n降到n//2,直原创 2020-11-22 12:19:45 · 118 阅读 · 0 评论 -
LeetCode 239. 滑动窗口最大值---Java题解
题目: 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3原创 2020-11-01 20:07:55 · 107 阅读 · 0 评论 -
LeetCode 148. 排序链表-Java题解(归并排序)
题目给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n*log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?看到O(n*log n)复杂度,不难想出,可以用归并排序来完成,但这与平时的归并排序又存在不同之处通过这张图可以看出典型归并的递归过程,先分割再合并,通常问题中可以说数据本身就是分割的,但链表并非如此,所以合并之前需要再添加一个环节,即分割环节想要分割就要找到链表的中点,这又涉及到了链表中点问题,使用典型的双指针思想就能解决,这里不原创 2020-10-27 22:40:59 · 343 阅读 · 0 评论 -
LeetCode 76.最小覆盖字串---Java题解
LeeCode 76.最小覆盖字串—Java题解题目:给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入:S = "ADOBECODEBANC", T = "ABC"输出:"BANC"提示:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,保证它是唯一的答案。题解:滑动窗口思想用i,j来表示当前滑动窗口的左边界和右边界,当当前的滑动窗口包含T的时候,记原创 2020-10-24 22:44:36 · 310 阅读 · 0 评论