![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
Rqff
这个作者很懒,什么都没留下…
展开
-
684. 冗余连接
684. 冗余连接rank优化的并查集,顺序遍历edges,如果边在同一连通分量,说明这条边是冗余的。时间复杂度:O(n)空间复杂度:O(n)class Solution { public int[] findRedundantConnection(int[][] edges) { int n = edges.length; Disjoint_Set...原创 2020-02-22 21:59:47 · 1084 阅读 · 0 评论 -
547. 朋友圈(并查集)
547. 朋友圈经过路径压缩的并查集,时间复杂度近似看成O(1)时间复杂度:O(n2)空间复杂度:O(n)class Solution { public int findCircleNum(int[][] M) { Disjoint_Set ds = new Disjoint_Set(M.length); for (int i = 0; i < M.len...原创 2020-02-21 21:51:41 · 167 阅读 · 0 评论 -
并查集及其优化详解
1.第一种实现方式:quick_find查询时间复杂度:O(1)合并时间复杂度:O(n)实现方式:采用数组,维护的数组实际上是一颗高度最大为2的树//quick_find实现class Disjoint_Set { private int[] parents; public Disjoint_Set(int n) { parents = new int[n]; for (i...原创 2020-02-21 18:43:26 · 1037 阅读 · 0 评论 -
952. 按公因数计算最大组件大小
952. 按公因数计算最大组件大小两数有共同的大于1的公因数时,就在二者画一条边,问图的最大连通子图的大小。如果将数的因子作为根节点,把数一个个的挂上去,可以用并查集。参考自:大佬的题解class Solution { public int largestComponentSize(int[] A) { int maxvalue = Integer.MIN_VALUE; for ...原创 2020-02-10 16:24:47 · 287 阅读 · 0 评论 -
快速幂模板
50. Pow(x, n)class Solution { double quick_pow(double x, long long N){ double ans = 1.0; // 贡献的初始值为 x double x_contribute = x; // 在对 N 进行二进制拆分的同时计算答案 while (N > 0) { if (N&1 == 1) { //N % 2原创 2020-05-11 10:21:16 · 119 阅读 · 0 评论 -
质数判断&区间质数统计
204. 计数质数要求统计所有小于非负整数 n 的质数的数量。解法1.质数判断遍历每一个小于n的非负整数,判断是否是质数。时间复杂度O(nnn\sqrt{n}nn),超时class Solution { public int countPrimes(int n) { int res = 0; for (int i = 2; i < n; i++) { if (isp...原创 2020-04-12 10:05:10 · 521 阅读 · 0 评论 -
268. 缺失数字
268. 缺失数字方法三:位运算分析由于异或运算(XOR)满足结合律,并且对一个数进行两次完全相同的异或运算会得到原来的数,因此我们可以通过异或运算找到缺失的数字。算法我们知道数组中有 nn 个数,并且缺失的数在 [0…n][0…n] 中。因此我们可以先得到 [0…n][0…n] 的异或值,再将结果对数组中的每一个数进行一次异或运算。未缺失的数在 [0…n][0…n] 和数组中各出现一次...转载 2020-02-15 21:57:26 · 134 阅读 · 0 评论 -
258. 各位相加
258. 各位相加看了两三天的线代和设计模式,本来想刷道简单题,没想到也不是那么简单。。暴力就不做了,没什么意思。看两个例子:964 -> 19 -> 10 -> 1964=9∗105+19=9∗105+2∗9+1=9∗107+1964 = 9*105 + 19 = 9*105 + 2*9 + 1 = 9 *107 + 1964=9∗105+19=9∗105+2∗9...原创 2020-02-15 21:19:48 · 72 阅读 · 0 评论 -
96. 不同的二叉搜索树(卡特兰数)
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数,则G(n)=f(1)...原创 2020-02-01 15:29:07 · 695 阅读 · 0 评论 -
经典动态规划:最长公共子序列(LCS)
最长公共子序列#include <iostream>#include <string.h>#include <algorithm>using namespace std;int main(){ string a, b; while(cin>>a>>b){ //dp[i][j] 的含义是:对于 s1[1..i] 和 s2[1..j],它们的 最长公共子序列 长度是 dp[i][j] int原创 2020-09-16 16:14:09 · 137 阅读 · 0 评论 -
152. 乘积最大子序列(简单dp)
152. 乘积最大子序列子串还能以O(n^2)的时间复杂度遍历,但是一看到…子序列,除非范围很小,否则暴力是别想了,考虑dp。思路跟之前做过的题很相似:最大整除子集思路:找乘积最大的连续子序列,那么我们就扫描一遍数组,维护一个最大值和一个最小值,因为有负数,如果出现负数,当前的最小值就变成了最大值。状态转移方程:max=Math.max(nums[i]∗max,nums[i]);min=...原创 2020-02-18 21:47:33 · 116 阅读 · 0 评论 -
368. 最大整除子集(类似LIS)
368. 最大整除子集先对数组排序,然后就很像最长上升子序列了,dp[i]就表示以nums[i]结尾的最大整除子集。转移方程:dp[i] = max{ dp[j] + 1} (0 <= j < i 且 A[j]%A[i] == 0)初始化:dp[i] = 1 (0 <= i < nums.length),另设路径数组path,用来记录回溯的路线。目标:max{dp[...原创 2020-02-17 15:54:21 · 188 阅读 · 0 评论 -
300. 最长上升子序列(LIS的优化)
300. 最长上升子序列这个题虽然是很早就做了,但是当初优化到O(nlogn),一直没能理解。dp[i]就表示以nums[i]结尾的最长上升子序列的长度。转移方程:dp[i] = max{ dp[j] + 1} (0 <= j < i )时间复杂度:O(n^2)class Solution { public int lengthOfLIS(int[] nums) {...原创 2020-02-17 15:53:02 · 205 阅读 · 0 评论 -
813. 最大平均值和的分组
813. 最大平均值和的分组dp[i][k] 表示将数组 A 中的前 i 个元素分成 k 个相邻的非空子数组,可以得到的最大分数。状态转移方程:dp(i, k) = max(dp(j, k - 1) + average(j + 1, i))dp(i, 0) = average(0, i)第一遍写代码,以正确为主。为了方便处理,将A数组的下标都加了1 ,放在temp数组里面了,反正d...原创 2020-02-12 11:28:09 · 162 阅读 · 0 评论 -
357. 计算各个位数不同的数字个数
357. 计算各个位数不同的数字个数有点像规律题n = 1,有0~9这10个数字n = 2,两位数有10*9-9=81个可能,再加上一位数的10个数,答案是91n = 3,三位数有81*8个可能,再加上一位数和两位数所以dp[i],就是i位数有几种可能,最后求和即可。class Solution { public int countNumbersWithUniqueDigits...原创 2020-02-10 19:43:41 · 523 阅读 · 0 评论 -
516. 最长回文子序列
516. 最长回文子序列子序列和子串是不同的,子序列是不连续的序列,而子串是连续的。这个题所求为最长的回文子序列,如果要遍历的话,时间复杂度为指数级别,肯定是超时的。这种要求为O(n^2)的时间复杂度,除了贪心,基本只有DP能做到了,那么子问题是什么呢?这样定义:如果已知区间 i - j 中最长的回文子序列长度为 dp[i] [j],那么区间 [i - 1,j + 1]有两种情况如果...原创 2020-02-09 17:03:47 · 206 阅读 · 0 评论 -
263. 丑数 & 264. 丑数 II & 313. 超级丑数
263. 丑数丑数就是只包含质因数 2,3,5的正整数。class Solution { public boolean isUgly(int num) { int temp; if(num < 0) return false; while(num != 1){ temp = num; ...原创 2020-01-31 20:44:03 · 129 阅读 · 0 评论 -
2019 第十届蓝桥杯Java省赛B组部分题解
目录试题A:组队试题B:不同子串试题C:数列求值试题 D: 数的分解试题 E: 迷宫(BFS)试题 F: 特别数的和试题 G: 外卖店优先级(模拟)试题 H: 人物相关性分析试题 I: 后缀表达式试题 J: 灵能传输 (前缀和)试题A:组队97+99+98+98+98 = 490试题B:不同子串答案:100public class M...原创 2020-02-26 10:09:49 · 592 阅读 · 1 评论 -
2019第十届蓝桥杯JavaB组省赛真题
第一题:组队题目描述作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少? (如果你把以上文字复制到文本文件中,请务必检查复制的内容是否与文 档中的一致。在试题目录下有一个文件 team.txt,...原创 2020-02-26 10:11:19 · 383 阅读 · 0 评论 -
3. 无重复字符的最长子串(滑动窗口)
3. 无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。思路:如果遍历所有子串并检查子串中字符是否重复,时间复杂度为O(n3),可以维护一个窗口,窗口中所有的字符...原创 2020-05-02 12:35:28 · 137 阅读 · 0 评论 -
面试题57 - II. 和为s的连续正数序列(尺取法)
面试题57 - II. 和为s的连续正数序列1.尺取法(滑动窗口)LeetCode中尺取法叫做滑动窗口,本题中,维护了两个窗口的左右端,sum为当前窗口的总和。如果i>target/2,必定有j>i,从而j+i必定大于target,所以只要窗口左端指针大于target/2,那么之后的窗口中的和再也不可能等于targetclass Solution { public int[]...原创 2020-03-06 11:24:10 · 120 阅读 · 0 评论 -
611. 有效三角形的个数(双指针)
611. 有效三角形的个数方法一、暴力时间复杂度O(n^3)class Solution { public int triangleNumber(int[] nums) { int n = nums.length; int res = 0; Arrays.sort(nums); for (int i = 0; i < n; i++)...原创 2020-02-17 20:28:37 · 324 阅读 · 0 评论 -
5374. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯算法)
5374. 长度为 n 的开心字符串中字典序第 k 小的字符串List<String> res; //答案集合不能定义为StringBuilder类型剩下的就是回溯算法class Solution { char[] key = { 'a', 'b', 'c' }; //res不能定义为StringBuilder类型 List<String>...原创 2020-04-19 12:14:23 · 236 阅读 · 0 评论 -
回溯问题
回溯问题,大多数用到DFS搜索,注意进入递归后即进入下一层搜索,但是当前方法并没有执行完,需要回溯,再次尝试下一种可能性。对于数据范围不大,需要遍历搜索,而使用普通循环又过于繁琐或根本不可行的时候,往往可以使用暴力搜索解决。17. 电话号码的字母组合class Solution { Map<Character, String> phone = new HashMap<Ch...原创 2020-04-09 17:15:07 · 247 阅读 · 0 评论 -
130. 被围绕的区域(DFS)
130. 被围绕的区域因为和边界连接的’O’不会改变,所以先从最层开始用DFS进行预处理,与边界连接的’O’做标记,预处理完再DFS进行改变。空间复杂度O(M*N)时间复杂度O(M*N)class Solution { int res = Integer.MIN_VALUE; int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }...原创 2020-02-22 10:39:38 · 79 阅读 · 0 评论 -
695. 岛屿的最大面积(DFS)
695. 岛屿的最大面积依然DFS,加上最大值判断,跟200. 岛屿数量基本一模一样class Solution { int res = Integer.MIN_VALUE; int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }; int r; int c; int count; public ...原创 2020-02-22 09:29:43 · 81 阅读 · 0 评论 -
200. 岛屿数量(并查集、DFS)
200. 岛屿数量方法一、DFS或BFS遍搜索遍改变,访问数组也不需要class Solution { int res = Integer.MIN_VALUE; int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }; int r; int c; public int numIslands(ch...原创 2020-02-22 09:11:47 · 190 阅读 · 0 评论 -
79. 单词搜索 & 面试题12. 矩阵中的路径
79. 单词搜索DFS,黄金矿工是找深搜求和,更新最大值,这个题是深搜更新状态,如果满足状态继续深搜,不满足状态返回false,这条路线就不再走了,只要有一条路线符合要求,主方法中的dfs返回值就是true了。ps:不用按单词中的顺序DFS,只要网格中的一条合法字符串包含着单词就可以。class Solution { int res = Integer.MIN_VALUE; int[][...原创 2020-02-12 13:37:21 · 122 阅读 · 0 评论 -
1219. 黄金矿工
1219. 黄金矿工把之前写的DFS稍微一改就过了,没有进行过多的优化,30ms,还是挺慢的class Solution { int res = Integer.MIN_VALUE; int[][] dir = new int[][] { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } }; int r; int c; int[][] map; b...原创 2020-02-10 10:45:25 · 201 阅读 · 0 评论 -
5347. 使网格图至少有一条有效路径的最小代价
5347. 使网格图至少有一条有效路径的最小代价BFS中每个点只入列一次,但有时,我们可能需要bfs中允许一个点入列多次才能解决问题,这种方法就是SPFA。class Solution { public int minCost(int[][] grid) { int m = grid.length, n = grid[0].length; boolean[][] vis = ne...原创 2020-03-02 10:51:05 · 157 阅读 · 0 评论 -
994. 腐烂的橘子(BFS)
994. 腐烂的橘子洪泛法class Solution { public int orangesRotting(int[][] grid) { int m = grid.length; int n = grid[0].length; int num = 0; //新鲜橘子的个数 Queue<Point> qu = new LinkedList<>();...原创 2020-03-04 09:02:12 · 100 阅读 · 0 评论 -
452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球贪心策略:按点的结束坐标排序后,每次取最前面的点。多举几个例子就能直观的看出来,不管这个气球多长,只要扎破最后,并且已经排过序,所有的气球都能扎破,为什么是最优?猜的吧…区间覆盖问题,最大活动兼容问题跟这个都挺像的,几种贪心策略都尝试一下。LeetCode官方题解时间复杂度为排序的时间复杂度O(nlogn)class Solution { pub...原创 2020-02-11 11:58:37 · 91 阅读 · 0 评论 -
659. 分割数组为连续子序列
贪心:按数字大小的顺序,尽量将当前数字与之前产生的数链连接在一起。考虑1 2 3 4 4 5 5 6这样一组数字,遍历到第二个4的时候,就应该检测能不能再组成一条新的数链,这时就把6给从count中减掉了,尽可能避免剩下短链。class Solution { public boolean isPossible(int[] nums) { Counter count =...原创 2020-01-29 16:06:28 · 194 阅读 · 0 评论 -
字符串匹配(KMP)
仅作个人总结,初学KMP不建议看本文1.暴力匹配:时间复杂度:O(mn)import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String S = scanner.next(...原创 2020-04-02 22:27:30 · 95 阅读 · 0 评论 -
C++日期类模拟的算法题
日期模拟类型的总结1. 计算天数#include <stdio.h>#include <iostream>using namespace std;#define ISYEAP(x) x%4==0&&x%100!=0||x%400==0?1:0int main(){ int n,y,m,d,x; int a[13][2]= { 0,0, 31,31, 28,29,原创 2020-09-16 18:48:21 · 209 阅读 · 0 评论 -
166. 分数到小数(模拟)
166. 分数到小数-1 -2147483648千算万算,没想到有这个样例…int的取值范围-231——231-1,也就是-2147483648——2147483647,输入并不越界,中间计算的时候就溢出了,要进行类型转换处理。还有一个点就是哈希表中存的是当前字符串的长度,便于出现循环节时,将左括号插入到字符串中。改之前的代码(溢出):class Solution { publi...原创 2020-02-11 14:34:31 · 96 阅读 · 0 评论