算法
溯夜流云
这个作者很懒,什么都没留下…
展开
-
用一个随机数函数去生成另一个随机数函数:rand(a)生成rand(b)以及rand(a,b) 生成rand(c,d)
让我们把这个问题泛化一下,从特殊到一般。现在我给你两个生成随机数的函数Randa, Randb。Randa和Randb分别产生0到a的随机数和0到b的随机数,a,b不相等 (相等就没必要做转换了)。现在让你用Randa实现Randb。首先当 a>b ,时,最简单的就是通过:int x=a;while(x>b){ x=randA();}return x;即只输出在0-b范围内的情况,但是对于a,b相差很大的情况,会导致循环随机多次,时间消耗太多,做了太多次...原创 2021-03-22 20:59:55 · 1641 阅读 · 0 评论 -
动态规划经典题目:最大连续子序列和、最大不连续子序列和
1.最大连续子序列和: 记数组为nums思路:记录dp[i]为i位置结尾的最大连续子序列和则有dp[i]=dp[i-1]>0?(dp[i-1]+nums[i]):nums[i];然后求dp数组的max即为最终结果1.最大不连续子序列和: 记数组为nums思路:记录dp[i]为i位置的最大不连续子序列和则有两种情况dp[i]=dp[i-1] 或者dp[i]=dp[i-2]+nums[i] 即不选或者选择当前位置那么整理为dp[i]=m...原创 2021-03-13 13:40:58 · 2009 阅读 · 0 评论 -
程序员面试指南(动态规划部分)5:最长公共子串
最长公共子串原创 2021-03-11 20:29:26 · 123 阅读 · 0 评论 -
程序员面试指南(动态规划部分)4:地下城游戏
class Solution {public: int calculateMinimumHP(vector<vector<int>>& dungeon) { //思路:需要计算最少所需的健康点,可以从最后的位置向前推 //因为最后位置所需的最少健康点是确定的 //由于骑士可以向右和向下,那么倒过来就是向左和向上推 //记dp[i][j]为i,j位置所需的最少血量,那么 //dp[i][j]=min{右边的最小,下边的最小}-dungeon[i][j]...原创 2021-03-11 19:38:14 · 167 阅读 · 0 评论 -
c++基础编程:实现常用数据结构或功能
1.给定一个数据类型,写它的赋值构造函数:例如:实现Stringclass MyString{public: MyString(char *data = nullptr); MyString(const MyString &str); ~MyString();private: char * myData;};MyString& MyString::operator =(const MyString &str) //赋值运算符{ //关注点:1.需...原创 2021-03-11 16:33:35 · 153 阅读 · 0 评论 -
剑指offer阅读 1:sizeof空类型会产生的结果
1.如果只是简单的空类型,那么结果为1,因为空类型的实例在内存中至少占用一个字节的空间,否则就无法使用了。2.如果包含构造和析构函数呢? 还是1,函数只需要知道地址,跟实例无关。3.如果有虚函数呢? 32位下为4, 64位下为8 ,因为虚函数的存在,实例必须有虚函数指针。...原创 2021-03-11 15:49:43 · 121 阅读 · 0 评论 -
程序员面试指南(动态规划部分)3:最长递增子序列
class Solution {public: int lengthOfLIS(vector<int>& nums) { int length = 0; int size = nums.size(); if (size <= 1) return size; vector <int> d(size, 1); for (int i = 0; i < size; i++) for (int j = 0; j < i; ++j) ...原创 2021-03-10 16:29:54 · 117 阅读 · 0 评论 -
程序员面试指南(动态规划部分)3:换钱的方法数
思路1:简单暴力递归思路2:对暴力递归的优化:即通过map等数据结构记录已经计算过一次的状态,后面再次计算只需要查表即可思路3:动态规划原创 2021-03-10 16:01:32 · 127 阅读 · 0 评论 -
程序员面试指南(动态规划部分)2:矩阵的最小路径和
思路:经典动态规划,设置数组dp[i][j] 记录[i][j]位置的最短路径,由于只能向右或者向下走所以dp[i][j]=min{dp[i-1][j],dp[i][j-1]}+m[i][j];时间复杂度O(N*M),空间复杂度为O(N*M)空间复杂度可以考虑通过状态压缩,压缩到O(min(N,M)),即通过滚动数组来记录状态变换,但是这种压缩的方法不适合需要输出路径过程的场景。无法回溯过程。...原创 2021-03-10 15:41:47 · 191 阅读 · 0 评论 -
程序员面试指南(动态规划部分)1:斐波那契系列问题
普通思路:1:根据动态规划的状态公式 , 时间复杂度O(N)2:对以上算法中的动态规划公式,转换为矩阵相乘,利用矩阵乘法(矩阵快速幂) 时间复杂度O(logN)...原创 2021-03-10 14:03:03 · 142 阅读 · 0 评论 -
面试算法题分类
1.自己复现经典数据结构或算法: 复现vector、string等数据结构 复现堆排序等经典算法这块更偏向考察基础知识的熟悉程度。2.其余算法这块更考察算法逻辑的能力和对不同数据结构的运用能力。...原创 2021-03-08 14:46:33 · 114 阅读 · 0 评论 -
动态规划例题 1:交错字符串
思路:用dp[i][j] 表示s1的前i个与s2的前j个交错成s3的前i+j个的结果(true或false)初始状态dp[0][0]=true ,零和零组成零,没毛病class Solution {public: bool isInterleave(string s1, string s2, string s3) { int len1=s1.length(); int len2=s2.length(); int len3...原创 2021-02-22 20:22:00 · 187 阅读 · 0 评论 -
C++复习之路:算法与数据结构相关10:二维动态规划相关,及动态规划总结:
先挖坑原创 2020-08-05 18:21:14 · 265 阅读 · 0 评论 -
深信服面试准备:C/C++软件开发工程师(云计算、网络安全方向)
9.重载和重写的区别:重载是静态多态,重写是动态多态只不过重载是通过同名函数的不同参数类型,参数个数实现不同的功能,而且这是在编译的过程中发生的;重写是通过虚函数的形式实现不同对象同名函数实现不同的功能,在程序运行的过程中发生。10.new,malloc,free和delete的区别:首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数malloc/free是..原创 2020-12-17 13:56:13 · 427 阅读 · 2 评论 -
深信服面试准备:C/C++软件开发工程师(云计算、网络安全方向)
1.c++有哪些容器,介绍一下。说说你对STL的了解,等等。 1.序列式:vector(动态数组,当前大小到达数组容量时进行2倍扩容,以此实现动态数组的效果)、list(双向链表)、 deque(双端队列)(将固定大小的多个数组用指针连接,以此实现首位插入和删除的功能) 2.关联式:(无序)unordered_map/set (底层是hash),特点是查找的时间复杂度是O(1)(有序)map/set (底层是红黑树)引申:为什么是红黑树不是平衡二叉树...原创 2020-12-17 12:55:24 · 1783 阅读 · 0 评论 -
力扣题:1139. 最大的以 1 为边界的正方形
思路:1 直接暴力法,每到一个新的节点就判断以它为左上角是否有正方形,在判断的过程中需要考虑多个条件,及时break减少时间消耗理论上该方法的时间复杂度为O(n*m)*min(n,m) (因为正方形长度最大也就原始网格长宽中最小的一个) ,空间复杂度为O(1)2 考虑到主要的耗时在于判断当前节点是否能构成正方形,可以考虑记录每个节点上下左右为1的边的状态,这样后续节点的判断只需要简单的加减即可。思路进一步可以简化为只需要记录每个节点左边连续1的个数和上边连续1的个数即可...原创 2020-12-12 19:09:25 · 163 阅读 · 0 评论 -
力扣题:634寻找错位排列
首先直接暴力的时间复杂度很大,下面先贴一个暴力法的结果,然后再是动态规划class Solution {public: int num=0; void dfs(int &sum,int &cur,vector<int> &re,vector<int> &der) { // if(cur>=re.size()) return; if(sum==re.size()-1&&..原创 2020-12-12 15:55:52 · 236 阅读 · 0 评论 -
力扣经典问题:判断形状是否重叠
1.两个矩形的重叠判断?判断边界即可,假设矩形1的left1,right1,top1,down1,只需要left1>right2||right1<left2||top1<down2||down1>top2 两个矩形就是分开的2.两个圆形的重叠判断?直接判断两个圆心的距离即可3.一个矩形一个圆形的重叠判断?注意题目的最后一句的提示,即找矩形内部或矩形边界上离圆心最近的一点,判断与圆心的距离,<=圆半径,说明有重叠class S...原创 2020-12-12 00:23:47 · 647 阅读 · 0 评论 -
算法:回溯+剪枝
回溯算法的定义:在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。解空间树:依据待解决问题的特性,用树结构表示问题的解结构、用叶子表原创 2020-12-09 14:15:10 · 3829 阅读 · 0 评论 -
力扣解题 1014. 最佳观光组合 有感:
对于设计多层循环寻找多个数的和差,乘积,除数之类的最值问题:可以设计一个local记录前几个数的最值,然后用少几层或者单层循环更新local和当前计算的最值,最终得到结果。注意可以直接一起计算的放到一起,不要被题目迷惑,例如下题的A[i]+i ,A[j]-j 其实是两个整体如果是暴力的话就是双层的循环了:class Solution {public: int maxScoreSightseeingPair(vector<int>& A)...原创 2020-12-08 22:57:36 · 124 阅读 · 0 评论 -
动态规划经典例题:最长公共子序列相关 、滑动窗口方法
最长公共子序列,可以拓展到非字符串的结构,如数组等,毕竟其实字符串也可以理解为字符数组例题:给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。示例0:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray著作权归...原创 2020-12-07 00:39:18 · 636 阅读 · 0 评论 -
面试常考问题:LRU(最近最久未使用)缓存策略的代码实现
主要思路:假设缓存有固定容量,在缓存头部的意味着是最近最久没使用的可以丢弃,在缓存尾部是刚刚使用过的对于读取缓存:get操作 (有则读取,并将该内容放到缓存尾部,代表刚刚使用;无则返回固定的值)对于写入缓存:put操作(有则更新,并将内容放到缓存尾部,代表刚刚使用;无则判断容量是否满,没满直接插入,满了就删除缓存头部再插入)这里想要两者都是O(1)的时间复杂度,可以考虑通过一个双向链表list和一个unordered_map以及一个最大容量max来实现其中list存储键值..原创 2020-12-06 16:53:21 · 212 阅读 · 0 评论 -
算法中前缀和的运用
前缀和定义: 对当前位置的前面所有位置的和或者差之类的计算,这样相当于空间换取时间,相当于,对后续位置的计算只需要在上次计算的基础上加上很少的计算即可。这么看似乎思路上很像动态规划,但是动态规划在前后状态的关系上比前缀和更加紧密或者说可能比前缀和更加复杂,前缀和可以算是动态规划中应用窄的一部分。举例子:一维的前缀和:对数组a[n] 一共n个数,输入:整数x范围:(1到n)输出:前x个数的和思路:利用一个数组b[n],记录每次前x个数的和,这样查询的时候只需要O(...原创 2020-12-03 21:27:39 · 344 阅读 · 0 评论 -
算法题记录2:跳格子问题
题目:存在一个数组:{0,1,2,3,1,2,3}其中包含的数字可能相同可能不同跳格子规则:不同的相邻数字只能一个一个跳,而相同的数字可以无视数组中的距离(一步即达)问题:问从初始位置到数组末尾需要跳多少次示例:{0,1,2,3,4,5,6,0}只需一次:(0到0){0,1,2,3,2,3,1,5}只需3步: 0->1->1->5思路:从分析状态来说,直观的思路是从左到右,但是左边的跳格子往右边哪里调其实是受右边影响的,这里粗暴一点可以考虑深度遍历,但是可能会...原创 2020-10-16 17:17:55 · 2826 阅读 · 1 评论 -
算法题系列记录1:
铺地砖、切蛋糕等等:有一个 M * N的矩阵,现在需要使用 1 * 2 的骨牌进行覆盖,问总的覆盖方案数有多少?注意点及思路:通过一个二维数组记录每个1*1大小格子的覆盖状态,0为没有覆盖,1为已经覆盖;那么在一个位置理论上存在,左边横放、右边横放;向上竖放例如,向下竖放4种;但其实可以限制为两种:如向右横放和向上竖放(因为上一行这一列位置的向下竖放跟这一行这一列位置的向上竖放是相同的);那么就会出现例如上一行是【0,1,1,0】这种状态,下一行必须是【1,X,X,1】下一...原创 2020-10-15 21:41:23 · 112 阅读 · 0 评论