算法
.Passion
欢迎来看我的博客 ,原博客地址: https://www.cnblogs.com/lyr-2000/
现决定重新启用博客园的博客,一部分比较浅的笔记将写到这个博客上
欢迎打扰,另外,个人博客网站也搭建成功,欢迎打扰:
https://lyr-2000.github.io/
展开
-
红黑树算法的简单实现
#include "stdafx.h" #include <iostream>#include <queue>using namespace std;void pause() { getchar(), getchar();}/*1. 根节点是黑色2. 空节点是黑色3. 一个节点是红色节点,其他孩子节点必定是黑色节点4. 任意一个节点到叶子节点,经过的黑色节点是一样的5. 红黑树 保证的是黑平衡,即 左右两边黑色节点平衡 ,最大高度是 2LogN , ..原创 2021-01-22 03:17:37 · 183 阅读 · 0 评论 -
单链表
单链表简单实现#include "stdafx.h" #include<iostream>#include<vector>#include<string>#include<algorithm>#include<unordered_map>using namespace std;void pause() { getchar(), getchar();}struct Node { int data; Node *原创 2021-01-21 22:35:15 · 93 阅读 · 0 评论 -
计数排序简单实现
#include "stdafx.h" #include<iostream>#include<vector>#include<string>#include<algorithm>#include<map>using namespace std;void pause() { getchar(), getchar();}const int N = 1e5;int a[N];int count_sort(vec...原创 2021-01-21 02:49:00 · 134 阅读 · 0 评论 -
TOP k问题解题思路
解法: 建立小根堆, 每次存入最小的元素, 当堆内元素大于 k 时候,弹出堆顶最小的元素遍历完整个数组后,堆内的 k个元素就是最大的K个元素class Solution {public: vector<int> topKFrequent(vector<int>& nums, int k) { vector<int> res; unordered_map<int,int>_map; pri原创 2021-01-16 00:24:42 · 140 阅读 · 0 评论 -
kruskal 最小生成树
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V, E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n-1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。输入格式第一行包含两个整数n和m。接下来m行,每行包含三个整数u,v,w,表示点u和点v之间存在一条权值为w的边。原创 2021-01-08 18:28:40 · 195 阅读 · 0 评论 -
Dijkstra最短路径算法实现
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出-1。数据范围1≤n,m≤1.5×105,图中涉及边长均不小于0,且不超过10000。输入样例:3 31 2 22 3 11 3 4输出样例:3原创 2021-01-08 18:13:31 · 450 阅读 · 0 评论 -
求约数
给定n个正整数ai,对于每个整数ai,请你按照从小到大的顺序输出它的所有约数。输入格式第一行包含整数n。接下来n行,每行包含一个整数ai。输出格式输出共n行,其中第 i 行输出第 i 个整数ai的所有约数。数据范围1≤n≤100,2≤ai≤2∗109输入样例:268输出样例:1 2 3 61 2 4 8#include <iostream>#include <cstring>#include <algorithm>using nam原创 2021-01-07 20:34:22 · 367 阅读 · 0 评论 -
埃式筛法 求质数
给定一个正整数n,请你求出1~n中质数的个数。输入格式共一行,包含整数n。输出格式共一行,包含一个整数,表示1~n中质数的个数。数据范围1≤n≤106输入样例:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N=1e6+10;bool vis[N];int res;void get_primes(int n) {原创 2021-01-07 19:57:31 · 182 阅读 · 0 评论 -
快速幂算法模板
a 的 b 次方对 p 取模的值。输入格式三个整数 a,b,p ,在同一行用空格隔开。输出格式输出一个整数,表示a^b mod p的值。数据范围0≤a,b,p≤109数据保证 p≠0输入样例:3 2 7输出样例:2#include <bits/stdc++.h>using namespace std;int main(void) { int a,b,p;cin>>a>>b>>p; int res =原创 2020-12-26 23:38:38 · 110 阅读 · 0 评论 -
leetcode .90 子集 #排列组合题目
90. 子集 IIDifficulty: 中等给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。**说明:**解集不能包含重复的子集。示例:输入: [1,2,2]输出:[ [2], [1], [1,2,2], [2,2], [1,2], []]SolutionLanguage: ****class Solution {public: vector<vector<int>> subsetsW原创 2020-12-25 22:33:51 · 90 阅读 · 0 评论 -
图的m着色问题
图的m着色问题的问题提出是,给定图 和m种颜色,如下图所示,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。问是否有一种着色法使G中每条边的2个顶点着不同的颜色。采用回溯法判断该图的色数。#include "stdafx.h" #include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;const int NUM = 1原创 2020-12-13 21:31:52 · 263 阅读 · 0 评论 -
逆波兰表达式计算加减乘除
输入复制“(2*(3-4))*5”返回值复制-10class Solution { stack<int> num; stack<char> sig; int com(int a,int b,char x) { if (x=='+') return a+b; if (x=='*') return a*b; if (x=='-') return a-b; if (x == '/' &原创 2020-11-30 20:35:07 · 428 阅读 · 0 评论 -
哈夫曼编码算法实现
package juc;import lombok.ToString;import java.util.HashMap;import java.util.Map;import java.util.PriorityQueue;/** * @Author lyr * @create 2020/10/28 19:43 */public class Main { /** * @param args */ public static void main(原创 2020-11-27 10:31:43 · 342 阅读 · 1 评论 -
leetcode#树#二叉树转单链表算法
面试题 17.12. BiNodeDifficulty: 简单二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点。**注意:**本题相对原题稍作改动示例:输入: [4,2,5,1,3,null,6,0]输出: [0,null,1,null,2,null,3,null,4,null,5,null原创 2020-11-24 16:22:44 · 341 阅读 · 0 评论 -
leetcode#搜索#水域大小模型总结#19.水域大小
面试题 16.19. 水域大小Difficulty: 中等你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。示例:输入:[ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1]]输出: [1,2,4]提示:0 < len(land) <=原创 2020-11-19 20:41:16 · 229 阅读 · 0 评论 -
leetcode#蓄水池抽样模型#398.随机数索引
398. 随机数索引Difficulty: 中等给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。注意:数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。示例:int[] nums = new int[] {1,2,3,3,3};Solution solution = new Solution(nums);// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。solution.pick(3)原创 2020-11-19 20:09:59 · 249 阅读 · 0 评论 -
dp#水题#箱子模型总结
题目描述已知三个int数组w,l,h,分别表示每个箱子宽、长和高,同时给定箱子的数目n。请设计算法,将箱子都堆起来(箱子不能反转),且上面箱子的宽度和长度必须小于下面的箱子。返回值为能够堆出的最高的高度。要求n小于等于500。测试样例:[1,1,1],[1,1,1],[1,1,1]返回:1import java.util.*;public class Box { static class Block{ int w; int l;原创 2020-11-19 15:11:07 · 695 阅读 · 3 评论 -
再看 N皇后问题暴力解法
题目描述已知正整数n,即在一个nxn的棋盘上放置n个棋子,使每行每列和每条对角线上都只有一个棋子,返回有多少种摆法方法。保证n小于等于15。测试样例:1返回:1import java.util.*;public class Queens { public int nQueens(int n) { Op op = new Op(); op.dfs(0,n); return op.result; } st原创 2020-11-19 14:32:47 · 355 阅读 · 0 评论 -
水题#floodfill算法实现
题目描述给定一个n乘m的矩阵map,其中map[i][j]表示坐标为(i,j)的格子,值为1代表该格子不能通过,0代表可以通过。现从(0,0)的格子走到(n - 1,m - 1),单位时间只能走一格,不能途径无法通过的格子,请返回最短时间。同时给定矩阵的大小n和m(n和m均小于等于100),并且一定能走到终点。import java.util.*;public class Flood { public int floodFill(int[][] map, int n, int m) {原创 2020-11-19 13:54:16 · 645 阅读 · 0 评论 -
leetcode#水题#680.验证回文字符串II
680. 验证回文字符串 ⅡDifficulty: 简单给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba"输出: True示例 2:输入: "abca"输出: True解释: 你可以删除c字符。注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。SolutionLanguage: 全部题目解题思路i, j 两个指针 一起靠如果 p[i] !=p[j] ,只能删除一个,要么删除 i, 要么删除 j原创 2020-11-17 21:09:00 · 68 阅读 · 1 评论 -
leetcode#水题#06.整数转换
面试题 05.06. 整数转换Difficulty: 简单整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。示例1: 输入:A = 29 (或者0b11101), B = 15(或者0b01111) 输出:2示例2: 输入:A = 1,B = 2 输出:2提示:A,B范围在[-2147483648, 2147483647]之间SolutionLanguage: 全部题目class Solution { public int convertInt原创 2020-11-17 18:45:41 · 136 阅读 · 0 评论 -
leetcode#水题#415.字符串相加
415. 字符串相加Difficulty: 简单给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式SolutionLanguage: 全部题目解题思路:大数乘法class Solution { public String addStr原创 2020-11-17 18:43:31 · 91 阅读 · 0 评论 -
leetcode#水题#1446.连续字符
1446. 连续字符Difficulty: 简单给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。示例 1:输入:s = "leetcode"输出:2解释:子字符串 "ee" 长度为 2 ,只包含字符 'e' 。示例 2:输入:s = "abbcccddddeeeeedcba"输出:5解释:子字符串 "eeeee" 长度为 5 ,只包含字符 'e' 。示例 3:输入:s = "triplepilloo原创 2020-11-17 13:29:32 · 391 阅读 · 0 评论 -
leetcode#水题# 541.反转字符串
541. 反转字符串 IIDifficulty: 简单给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = "abcdefg", k = 2输出: "bacdfeg"提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。So原创 2020-11-17 13:23:28 · 113 阅读 · 0 评论 -
leetcode#406最长回文串长度
409. 最长回文串Difficulty: 简单给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。SolutionLanguage: 全部题目class Solution { public int lo原创 2020-11-17 09:48:02 · 84 阅读 · 0 评论 -
#leetcode#公因数#1071. 字符串的最大公因子
对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请原创 2020-11-17 09:41:05 · 84 阅读 · 0 评论 -
约瑟夫环问题 递归解法!
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。输入: n = 5, m = 3输出: 3class Solution { public int lastRemaining(int n, int m) { return f(n,m); } in原创 2020-11-15 16:24:33 · 348 阅读 · 0 评论 -
# 快速排序解决 top K问题
数组中的第K个最大元素import java.util.Arrays;import java.util.concurrent.ThreadLocalRandom;class Solution { public int findKthLargest(int[] nums, int k) { return SortUtil.quickSelect(nums,0,nums.length-1,nums.length-k); } stati.原创 2020-09-25 14:56:01 · 223 阅读 · 0 评论 -
#算法回顾#手撕经典算法
import java.util.Arrays;import java.util.Comparator;public class Main { public static void main(String[] args) { Integer[] p = {2, 4, -1, 44, 22, 77, 4, 2, 77}; SortUtil.quickSort( p, (i, j) -> i - j); System.out.pri..原创 2020-09-15 21:08:18 · 107 阅读 · 0 评论 -
百钱百鸡问题最优解法
/* 题目描述: 公鸡 5元,母鸡3元一只,小鸡1元3只 设变量为 x ,y, z x+y+z = 100; 5x+3y+ (1/3z) = 100 可以推出 7x+4y = 100 而 只要枚举公鸡的值,就可以得出小鸡和 母鸡的数了 公鸡的范围 是 x>1 和 x<=18, 且 (100-7x) 一定是 4的倍数*/#include "stdafx.h"#include<iostream>int main(void) { for (int i原创 2020-08-19 12:16:17 · 1716 阅读 · 0 评论 -
#二叉树#BST tree总结
删除二叉搜索树中的节点:https://leetcode-cn.com/problems/delete-node-in-a-bst/◼ 二叉搜索树中的搜索:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/◼ 二叉搜索树中的插入操作:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/◼ 验证二叉搜索树:https://leetcode-cn.c原创 2020-07-25 20:23:36 · 298 阅读 · 0 评论 -
图论基本算法的实现
package util;import java.util.LinkedList;import java.util.*;/** * @Author lyr * @create 2020/7/25 13:44 */public class Graph { private class Node { private String label; public Node(String label) { this.label = la.原创 2020-07-25 15:35:44 · 229 阅读 · 0 评论 -
DES加密算法(对称加密)
对称加密算法常见的算法1.DES : Data Encryption standard2.AES : Advanced Encryption standard自己可以指定密钥,用密钥就可以破解了也就是 加密和解密是互逆的底层的原理一般是操作二进制下面是 DES加密解密算法的 API ,因为用UTF-8编码,会报错,因此必须是用 Base64编码一下import java.security.Keyimport java.util.*import javax.crypto.Cipheri原创 2020-06-29 23:24:07 · 689 阅读 · 0 评论 -
凯撒加密算法
凯撒加密算法使用kotlin语言演示把字母移动一定的位数来实现加密和解密(转ascii码 加上一个数)/** * @Author lyr * @create 2020/6/29 19:49 */fun main() {// testPrint() //凯撒加密算法 val util = CaesarCrypt() val result = util.encrypt("hello world",66) println("答案 : $result")原创 2020-06-29 22:08:18 · 599 阅读 · 0 评论 -
Kmp算法的变题
字符串包含字符串包含时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:9356本题知识点: Java工程师 C++工程师 快手 字符串 模拟 游戏研发工程师 快手 2019算法知识视频讲解校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。题目描述我们定义字符串包含关系:字符串A=abc,字符串B=ab,字符串C=ac,则说A包含B,A和C没有包含关系。输入描述:两个字符串,判断这个两个字符串是否具有包含原创 2020-05-23 11:49:27 · 133 阅读 · 0 评论 -
最长上升子序列问题(dp)
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?来源:力扣(Leet...原创 2020-05-08 13:39:00 · 180 阅读 · 0 评论 -
最长上升子序列变题(搭积木)
搭积木小明有一袋子长方形的积木,如果一个积木A的长和宽都不大于另外一个积木B的长和宽,则积木A可以搭在积木B的上面。好奇的小明特别想知道这一袋子积木最多可以搭多少层,你能帮他想想办法吗?定义每一个长方形的长L和宽W都为正整数,并且1 <= W <= L <= INT_MAX, 袋子里面长方形的个数为N, 并且 1 <= N <= 1000000.假如袋子里共有5...原创 2020-05-08 01:47:12 · 546 阅读 · 0 评论 -
数字拆分问题 (回溯法)
package app;import java.util.LinkedList;/** * @Author lyr * @create 2019/9/30 0:28 */public class Main { public static void main(String[] args) { int sum = 8; //数字拆分问题:...原创 2020-02-01 18:59:23 · 601 阅读 · 0 评论 -
全排列问题(回溯法)
package app;import java.util.Arrays;import java.util.HashMap;/** * @Author lyr * @create 2019/9/30 0:28 */public class Main { public static void main(String[] args) { int[] arr ...原创 2020-02-01 18:21:16 · 328 阅读 · 0 评论 -
八皇后问题(回溯法)
package app;import java.util.*;/** * @Author lyr * @create 2019/9/30 0:28 */public class Main { public static void main(String[] args) { System.out.println(new Solution().solveNQ...原创 2020-02-01 17:41:30 · 139 阅读 · 0 评论