![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法实验室
文章平均质量分 65
介绍各种奇奇怪怪的算法,并从个人角度去进行剖析,已经通用化
卜若
love game,love life
展开
-
c++Lab-左值引用和右值引用
c++Lab系列1.左值与右值1.1 左值1.2 右值2. 左值引用和右值引用3. 绑定左值或者左值引用的值->右值引用4. 右值引用有什么用4.1 左值引用的用处4.2 右值引用的用处4.2.1 移动语义4.2.2 右值引用的总结1.左值与右值1.1 左值既可以出现在左边也可以出现在右边 int a = 10; int b = a; //此时a可以出现在左边,也出现在右边,所以它是左值1.2 右值只能出现在右边,或者称为临时变量 4 = a a+b = c //显然的原创 2021-06-24 15:44:18 · 119 阅读 · 1 评论 -
算法总纲-算法范式与技巧[目录]
10天回顾157道算法目录1.回溯算法1.1 二维地图问题2.动态规划2.1 maxLen特征问题目录1.回溯算法1.1 二维地图问题这种问题已经属于已经定式的解法,核心就是上下左右移动以及海洋包围城市案例1:leetcode 1020案例2:leetcode 1302.动态规划2.1 maxLen特征问题案例1:leetcode 873...原创 2021-06-19 19:08:24 · 195 阅读 · 0 评论 -
c++Lab-进程间通信的几种方式
1. 基于套接字的通信[集群案例]现在的集群通常就是基于套接字的,集群的概念就是存在一个中央服务器,A,以及工作服务器B,C,D,E一开始,BCDE会和A建立连接其中B是注册,C是登录玩家进入游戏后,直接和E进行交流,E负责响应玩家的输入和输出。现在有一个问题,玩家希望从B1点到达B2点,涉及到了寻路,因为训练操作是很费资源的,我们并不希望在E里面进行操作,而是重新加一个服务器D直接负责寻路的工作,所以,E会访问A检索:哪个服务器是做寻路的呀?A查询了自己的“数据库”知道D是做寻路的,就把D的地原创 2021-06-18 16:55:23 · 517 阅读 · 0 评论 -
算法-动态规划-子问题分析案例[level2]
平衡二叉树的个数子问题分析step1 数学建模原始问题中,要求f(n)的平衡二叉树个数.举个例子,设n = 5,设g(n)=二叉搜索树个数g(n) = 二叉搜索树个数 g(n)=二叉搜索树个数f(n,i)为当root为i时的二叉搜索树个数f(n,i) 为 当root为i时的二叉搜索树个数f(n,i)为当root为i时的二叉搜索树个数例如:当n = 5时,f(n,2) 为显然的:g(n)=∑i=1n(f(n,i))g(n) = \sum_{i=1}^n(f(n,i))g(n)=i=1∑n原创 2021-06-09 19:00:56 · 409 阅读 · 0 评论 -
算法-动态规划记忆篇练习
题目列表1. 斐波那契一维斐波那契问题,记忆2.房间移动二维斐波那契问题,记忆3.canSum(n,[a,b,c])问题can sum问题,回溯,记忆,返回true or false4.凑硬币best sum问题,回溯,记忆,返回路径或者(空路径)5.求和how sum问题,记忆,返回- 1或者最大值,回溯6.canContruct(abcdef,[ab,abc,de,def])7.countContruct(abcdef,[ab,abc,de,def])8.allCon原创 2021-06-07 09:55:39 · 114 阅读 · 0 评论 -
算法-二分法应用技巧
level 1一个非常简单的二分应用问题,假设你有一个升序数组,然后让你去search一个target的index比如vector<int> arr({1,2,3,4,5,6,7,8});使用二分法就比较简单了 vector<int> arr({1,2,3,4,5,6,7,8,9}); int l = 0; int r = arr.size() - 1; int v = 7; while(l&原创 2021-06-06 22:53:01 · 135 阅读 · 0 评论 -
算法-动态规划与记忆递归[优化树][递推式推算技巧][状态压缩技巧]
简述基础算法包括:回溯,分支限界,分治,穷举,动态规划。其中,动态规划是整个基础算法的明珠,最难,却也极为吸引人。动态规划要解决的问题,基本可以描述为可以递推的问题,最简单的动态规划就是斐波那契数列。使用动态规划可以做,但通常情况下,直接设计动态规划的dp数组以及推算动态规划的状态转移方程是一件非常困难的事情,斐波那契之所以简单,是因为它已经将状态转移方程提交给你了,所以你会觉得简单。通常情况,尤其在做算法题的时候,时间并不允许你推算其状态转移方程,所以这个时候使用经验法的记忆递归解题会更加有效。所谓原创 2021-06-04 08:41:45 · 305 阅读 · 0 评论 -
回溯算法-胡牌问题[组合问题的进阶]
原始题目:雀魂启动题目的大致意思就是,有13张排,加一张,就能胡,用贵州话讲就是一对将,然后加四坎牌。一坎牌可以是三个一样的碰,也可以是顺子。现在,让你用程序去判定任意一组13排是否能胡,并给出需要哪个牌来胡牌。这个显然是一个经典的回溯问题,但是和我们常见的回溯问题又有一些区别,比如:组合问题class Solution {public: vector<vector<int>> arrs; map<string,int> maps; ve原创 2021-06-02 21:10:42 · 268 阅读 · 0 评论 -
排序算法-快速排序
一种分治算法分治操作,将一个数组分治成leftBlock,和rightBlock,其中leftBlock的值小于选取的pivot,而rightBlock的值大于选取的pivot难点1 排序预处理选取一个pivot(这个值一定是最后一个,但是你可以事先进行交换,所以这里面说的是任意),重置vector<int>& nums,使得nums左边的值一定小于pivot,而右边的值一定大于pivot vector<int> a{7,1,5,3,8,6}; int p原创 2021-06-02 15:54:10 · 113 阅读 · 0 评论 -
排序算法-冒泡排序
算法原理执行n次的将 最大值放置到最后的操作难点:1. 将最大值冒泡到最后一位//# vector<int> &vec;for(int i =0;i<vec.size()-1;i++){ if(vec[i]<vec[i+1]){ swap(vec[i],vec[i+1]); }}//将这个操作执行若干次就行 //一个简单的测试用例 void bubbleRank(vector<int>& nums){ fo原创 2021-06-02 14:44:00 · 77 阅读 · 0 评论 -
算法实验室-29-回文分割问题[记忆递归][失败]
原题检测回文 public boolean detectReText(String val){ boolean match = true; for (int i =0;i<val.length()/2;i++){ if(val.charAt(i)!=val.charAt(val.length()-i-1)){ match = false; break;原创 2020-11-18 13:55:47 · 162 阅读 · 0 评论 -
算法实验室-28-加油跑路问题[贪心算法]
贪心算法本质一句话概括就是局部最优最经典的例子就是冒泡排序:我总是希望选中“最大的值”沉入到数组的底部每一次,就是一个局部最优的过程 for(int i =0;i<arrs.length;i++){ int select = arrs[i]; for(int j = i+1;j<arrs.length;j++){ //局部最优 if(arrs[j]&原创 2020-11-16 22:37:05 · 141 阅读 · 0 评论 -
算法实验室-27-分糖果[动态规划][candies[i] = max{candies[i-1], candies[i+1]} + 1]
动态规划本质你需要通过某个常见(明显)的关键句直接定位当前的问题是否适合采用动态规划首先,我们要撸一个关键句:分数高的小朋友比他旁边得分低的小盆友的糖果多然后我们就能够构建一个状态转移方程candies[i] = max{candies[i-1], candies[i+1]} + 1有了状态转移方程,那你岂不是可以...嘿嘿嘿嘿?我会单独开一个算法实验室-动态规划总结里面去总结遇到的可能的动态规划的套路。基于状态转移方程实现代码candies[i] = max{can原创 2020-11-16 20:45:46 · 321 阅读 · 0 评论 -
算法实验室-26-求解f(x+x+x+y)= y的f关系[int拆分bits][bits转int][模]
加法的本质原题其实我觉得评论讲得比我的都好,我主要还是喜欢第二种,第一种针对性太强,不是很喜欢(绝对不会承认看不懂)第二种思路就是将f(A) = singleNumber就是将A所有的元素加起来,相同的值在某种f关系下=0,只留下singleNumber;如何求解f(3+3+3+4) = 4?的f?这是一个典型的脑筋急转弯(程序里面的):比如f(3+3+3+4) = 4?看吧,这种东西就是认知之外的东西。所以,我先提一嘴名言:人类无法操作认知之外的东西,天才除外;原创 2020-11-16 17:14:15 · 115 阅读 · 0 评论 -
算法实验室-25-链表的深拷贝
原题:https://www.nowcoder.com/practice/60e43001345241ba9266cb4ee6fc6350?tpId=46&tqId=29041&rp=1&ru=%2Fta%2Fclassic-code&qru=%2Fta%2Fclassic-code%2Fquestion-ranking比较简单,没啥东西public class Solution { public RandomListNode copyRandomList(原创 2020-11-16 16:07:54 · 83 阅读 · 0 评论 -
算法实验室-24-拆分词句
题目地址:https://www.nowcoder.com/practice/5f3b7bf611764c8ba7868f3ed40d6b2c?tpId=46&&tqId=29041&rp=1&ru=/ta/classic-code&qru=/ta/classic-code/question-ranking本题相当于是上一题的弱化实现本身并不难,奇葩的是对时间复杂度要求过于变态上文提出的两种单词遍历方法:一种是根据dict中获取的单词的长度去取出字符串原创 2020-11-16 12:42:46 · 143 阅读 · 0 评论 -
算法实验室-23-递归的记忆
递归的记忆一个很简单的题目:有一串字符串“abcdabcdabcdabcd”我希望通过递归的方式将它拆分成四个abcd并记录到List<String>中使用递归很简单: public List<String> recursionMemory(String data){ List<String> list = new ArrayList<String>(); if(data.length() == 0原创 2020-11-15 21:28:29 · 187 阅读 · 0 评论 -
算法实验室-22-从字符串中分割出单词[2-优化]
回顾在上个问题,我们实现了如何返回一个字符串的组成的单词的集合的所有可能的情况但是,有一个比较严重的问题就是:时间复杂度过高,这一节,我们的核心目的就是在于去分析,为什么它的时间复杂度如此之高?直接看原文代码吧: //请在构造初始化 public List<String> l3; String output = ""; public void recursion3(String data,int len){ //递归结束条件原创 2020-11-15 19:52:22 · 409 阅读 · 0 评论 -
算法实验室-21-动态规划-从字符串中分割出单词问题[1]
题目描述:为了完成这个任务,我们会分步骤的先给出一些前置的问题和解法,然后再通过这些解法的组合使用去完成本题(算法实验室的本质)问题1:如何将一个字符串分解成各种组合比如abcdef->a,b,c,d,e,f,ab,cd,ef,abc,bcd,cde,def,abcd...显然的,这并不是一个组合问题,而是一个穷举问题。先来实现这个问题: /** * * 将字符串拆分成不同长度的组合 * @param str * @retur原创 2020-11-15 01:00:18 · 393 阅读 · 0 评论 -
算法实验室-20-单链表的环(判断环,求环长度,求环的入口)
环的定义确实,如果没有接触过环的概念,那么第一印象就是一个圈,也就是如果出现一个题,询问环的入环节点时通常会很懵逼的:一个完整的圈,哪哪都是入口,这道题有病?直到...你看了环的相关原理之后,你才会恍然大悟:哦,原来是这样。随便找一篇文章:https://blog.csdn.net/lym940928/article/details/88878425我们直接来看一张图:也就是说,“环”并不一定就是一个圈,可能还带着个尾巴。详细定义: 就看图呗,反正我没找到,反正楼上这张图统称原创 2020-11-13 16:47:41 · 222 阅读 · 0 评论 -
算法实验室-19-链表重排(链表拆分,翻转,合并的综合应用)
原题:来自于牛客的经典必刷题第8原理还是比较简单的1.将一个链表拆分成两段2.将链表翻转3.将链表进行合并基本代码: public void reorderList(ListNode head) { if(head == null||head.next == null){ return; } //将链表从中间截断成两截 ListNode[]原创 2020-11-13 13:09:16 · 206 阅读 · 0 评论 -
算法实验室-18-后序遍历的邪道与正道
三序遍历的遍历顺序先序:根->左->右(非常简单,一个深度搜索搞定,逻辑清晰)中序:左->根->右(算法比较复杂)后序:左->右->根(邪道很简单,基于反向先序的逆序,借助双栈,正道借助单栈)后序遍历的邪道算法算法的基本灵感:如图所示:先序遍历是:ABDEGCFHI后序遍历是:DGEBHIFCA我们往后的实验场景通常会基于这个场景,所以我们一般需要先构造出这样一个树:package BinaryTree;public.原创 2020-11-12 23:50:15 · 154 阅读 · 0 评论 -
算法实验室-17-单链表两两翻转
接上一章,依旧是翻转问题我们希望给你一组链表1,2,3,4,5然后让你翻转2,1,4,3,5...这也是一个算法问题,那么对于这种算法的核心就在于:原创 2020-11-11 22:04:14 · 216 阅读 · 0 评论 -
算法实验室-16-单链表的翻转
链表翻转(栈)算法过程描述为:1.定义一个新的head2.一直找到最后一个节点插入到head...时间复杂度为o(n+n-1+n-2+...+1) = o(n!)...这种想法肯定是极度糟糕的最好的还是基于栈的1.依次入栈2.出栈,构建链表package List;import Debug.Debug;import java.util.LinkedList;import java.util.List;import java.util.Queue;imp原创 2020-11-11 13:43:08 · 622 阅读 · 0 评论 -
算法实验室-15-插入排序
理解插入排序什么是插入排序?这个问题得问链表,链表本身是拥有一个方法,叫insert(ListNode node)的函数实现这个函数其实还是很简单的 //插入函数 public void insert(ListNode parent,ListNode value){ ListNode temp = parent.next; parent.next = value; value.next = temp; }那么,拥有这个插原创 2020-11-10 00:18:01 · 147 阅读 · 0 评论 -
算法实验室-14-怎么获取链表的中间节点?怎么从中间截断链表?
1 怎么获取中间点?小明每秒跑200米小华每秒跑100米跑道长1000米当小明到终点时,小华的位置equals the mid of the runway所以,一样的道理,如果我要快速找到一个链表的中点呢?首先,得有一个小明:faster然后,有一个小华:lower当faster arrive the destination while the lower touch the mid point终止条件就是faster的next为null既然要判定faster的.原创 2020-11-05 23:14:17 · 306 阅读 · 0 评论 -
算法实验室-13-基于链表的归并
基于链表的归并归并的思想还是很简单的,要完成一个归并,还是需要一个归并框架重新来总结一遍归并的过程描述为:通过递归将一长串数据二分到原子级,然后排序,合并基于这样的原理,我们可以对链表的归并先做一个初步的归并框架...原创 2020-11-05 22:59:06 · 204 阅读 · 0 评论 -
算法实验室-12-归并排序
归并排序:思想其实很简单,首先就是一个二分的思想,分而治之而要完成一个二分的递归结构还是非常简单的 static void dcFunc(int[] arr,int begin,int end){ if(end-begin<=0){ return; } int mid = (end - begin)/2; //中间位 int midPos = mid+begin;原创 2020-11-05 00:18:42 · 246 阅读 · 0 评论 -
卜若的代码笔记-算法实验室:十一:二叉树的遍历(基于栈)
1 我们直接参考https://blog.csdn.net/rikeyone/article/details/94407275这个老哥给出的图了:先构成一个节点树:深度搜索可以实现前序遍历:package 二叉树;public class Node { public Node(String value){ this.value = value; } public Node addLeft(Node nd){ this原创 2020-09-15 16:11:55 · 129 阅读 · 0 评论 -
卜若的代码笔记-算法实验室:十:递归搜索(二)交易链问题
1 还是上一章的问题我们对递归的这种搜索特性其实已经有了了解,那么,这道题,我们就能够绘制出它的搜索树,我们将周期缩短为5天,并在5天中进行交易,那么就有图:这个时候,你就发现,卖出的时间恰好是买入时间的第2,3,4...n天,这个时候,你就可以递归了,当然,这个树不止递归可以操作,还能深度搜索,广度搜索:不过我们还是使用递归吧: int stock(int[] arr,int start){ int earnings = 0; for..原创 2020-08-31 19:35:19 · 131 阅读 · 0 评论 -
卜若的代码笔记-算法实验室-九:递归搜索(一)
1 名字是我自己取的,主要是比较形象,先来看原题比如讲,一组数据如[7,1,5,3,6,4]你需要找出哪天买入,哪天卖出,从而获取最大收益。这个过程是一个粘性搜索,比如,你第一天以7元一股买入了股票,然后,你需要在接下来的[1,5,3,6,4]的某一天卖出,获取收益,获取了之后,你希望继续寻找下一次出手的机会如果用图像来进行表达就是第n天买入: (存在收益时) 第n+x天卖出:第n+x+1天买入 (存在收益时)第n+x+1+x2天卖出 ...原创 2020-08-31 16:27:57 · 206 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第八个算法案例分析:无重复字符的最长子串
常规的解法是:比如一个字符串abcabcbb每一次截取一段abcabcbb->捕捉不重复串 = abcbcabcbb->捕捉不重复串 = bcacabcbb->...abcbb->...bcbb.->...,,,最后将所有不重复串填塞到一个表里面获取这个表中最长串的长度返回:/* * @lc app=leetcode.cn id=3 lang=java * * [3] 无重复字符的最长子串 */// @lc code..原创 2020-07-06 18:26:44 · 140 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第七个算法案例分析:两数相加
这个题目乍看一眼挺简单,两个链表循环求和除余就搞定了,但是,如果你这样搞就会出现一个有意思的问题,溢出:/* * @lc app=leetcode.cn id=2 lang=java * * [2] 两数相加 */// @lc code=start/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN...原创 2020-07-06 11:20:15 · 116 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第六个算法案例分析:两数之和
比较简单,两层for循环就可以了,虽然效率感人public int[] twoSum(int[] nums, int target) { int[] num2 = new int[2]; int index = 0; num2[0] = 0; num2[1] = 1; for (int i =0;i<nums.length;i++){ fo...原创 2020-07-05 22:49:15 · 98 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第5个算法案例分析:Goods Transportation
1.这道题的意思是我有n个供货的仓库有m个需要供货的商店现在需要你设计一个算法,统计里面最多的运输次数和最小的费用其中费用为n(1,2,3,4...n)和m(1,2,3,...,m)的运输两边的仓库和商店对应的索引的和值2.原始题目Goods TransportationDescriptionThe transportation problem is to...原创 2019-12-14 20:03:59 · 260 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第4个算法案例分析:哈夫曼编码求最长编码长度
1. 这一题的问题是给你一窜字符串AAAAABCD如果使用ASCII编码,则是64位现在让你使用哈夫曼编码,则需要多少位?原始题目:题目1:EntropyDescriptionAn entropy encoder is a data encoding method that achieves lossless data compression by encoding a...原创 2019-12-14 12:29:27 · 1378 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第3个算法案例分析:斐波那契最长动态规划算法
题目2:Fibonacci SubsequenceA sequence of integer numbers a1, a2, ..., anis called a Fibonacci sequenceif ai= ai-2+ai-1for all i=3,4,...,n. Given a sequence of integer numbers c1, c2, ..., cm...原创 2019-12-13 12:31:50 · 144 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第2个算法案例分析:HHM预测模型分析
1. 关于这个模型就去看https://www.cnblogs.com/pinard/p/6991852.html这篇博客吧...我主要是将这个它的那个案例画了一张图案例代码:package com.company;import java.util.Stack;public class HHMPreditionModel { public static...原创 2019-12-12 16:13:52 · 319 阅读 · 0 评论 -
卜若的代码笔记-算法系列-第1个算法案例分析:Fibonacci Subsequence(今天乃至之后的一个星期,我们来讲算法吧!)
1.原题:describeA sequence of integer numbers a1, a2, ..., anis called a Fibonacci sequenceif ai= ai-2+ai-1for all i=3,4,...,n. Given a sequence of integer numbers c1, c2, ..., cmyou have ...原创 2019-12-02 14:33:55 · 124 阅读 · 0 评论