算法
_阿锋丶
这个作者很懒,什么都没留下…
展开
-
动态规划:零钱兑换问题(javascript求解)
前言昨天天面试时突然提到一嘴动态规划,结果面试官问我动态规划是啥子,我竟然一时表达不出来,在这里用自己的话重复在练习一下:动态规划就是先找到大问题的子问题,将子问题的解作为中间结果递推求解最终问题,而且子问题的解要是局部最优的。动态规划问题的一般解题步骤确定状态:一般是可以用数组表示状态化成子问题:涉及到问题的最后一步怎么求解的(比如跳台阶问题的最后一般可以调上一节台阶和跳上2节台阶得到 dp[n] = dp[n-1]+dp[n-2]初始条件和边界情况需要注意 (设置 dp[0] = 1)原创 2021-03-27 20:08:03 · 789 阅读 · 1 评论 -
剑指offer:数组中只出现一次的数字
map<int ,int> maps; for(int i=0;i<data.size();i++){ maps[data[i]]++; } vector<int> a; int j=0; for(const int e:data){ if(maps[e]==1){ a.push_back(e); ...转载 2021-02-19 22:20:07 · 172 阅读 · 0 评论 -
剑指offer:求两个链表的第一个公共节点
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *ta = pHead1; ListNode *tb转载 2021-02-19 22:12:29 · 188 阅读 · 0 评论 -
剑指offer:数值的整数次方
文章目录题目描述思路及代码方法一:暴力方法方法二:递归法(快速幂)方法三:非递归的快速幂题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路及代码方法一:暴力方法很显然就是n个b相乘。循环n次。class Solution {public: double Power(double base, int exponent) { if(exponent == 0转载 2021-02-17 21:48:40 · 138 阅读 · 0 评论 -
剑指offer:变态跳台阶和跳台阶
前言这道题目如果能写出迭代式,就会感觉极其简单。由于我大一的时候遇到过此题;优点印象,所以两分钟就写出来了,极其开心。(完全靠自己所想,所写出的题目实在不多)题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路f(n) = f(n-1)+f(n-2)+…+f(1);f(n-1) = f(n-2)+…+f(1);所以:f(n) = 2f(n-1);代码class Solution {public: int原创 2021-01-31 12:28:32 · 122 阅读 · 0 评论 -
剑指offer:构件乘积数组
文章目录题目描述思路代码题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。思路此题目能用暴力的方法肯定是能做出来的,可以将B数组的每一个数一个个的求转载 2021-02-13 18:39:50 · 133 阅读 · 0 评论 -
剑指offer:不用加减乘除法做加法
文章目录题目描述思路源码题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路这道题不可以用上面的方法,那大概只可以用二进制运算求解了,由此可以联想到计算机组成原理学的加法器,两个二进制数相加的结果可以用异或运算,而两个二进制的进位相加是用与运算求解。下面是牛客网大神的易懂解说:首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终原创 2021-02-10 16:59:27 · 285 阅读 · 0 评论 -
剑指offer:数组中出现次数超过一半的数
题目描述题目抽象:给定一个数组,找出数组中的众数,若有,返回众数,若没有,返回0众数定义:数组中出现次数大于数组一般的元素思路及代码哈希此题目一开始我想到的就是这种哈希的方法,先把每个数的出现次数存到数组中,再把此数组遍历一次,返回众数;下面第一个是我自己的代码有点繁琐。第二个是灵活运用c++的map结构后的简化代码,两种思想相同;代码一时间复杂度:O(n^2)空间复杂度:O(n)class Solution {public: int MoreThanHalfNum_So原创 2021-02-04 11:59:57 · 285 阅读 · 0 评论 -
剑指offer:合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路及代码迭代求解如果l1指向的结点值小于等于l2指向的结点值,则将l1指向的结点值链接到cur的next指针,然后l1指向下一个结点值否则,让l2指向下一个结点值 循环步骤1,2,直到l1或者l2为nullptr 将l1或者l2剩下的部分链接到cur的后面/*struct ListNode { int val; struct ListNode *next; ListNode(in转载 2021-02-01 12:30:34 · 102 阅读 · 0 评论 -
输入一棵二叉树,判断该二叉树是否是平衡二叉树。(剑指offer-平衡二叉树)
class Solution {public: map<TreeNode*,int> depthArr; int depth(TreeNode *node){// 如果没有节点,直接返回0 if(!node) return 0;// 下面的代码就是为了计算出每一个节点的深度,并把它存在c++映射结构map中 if(depthArr.find(node)!=depthArr.end())原创 2021-01-27 11:52:27 · 181 阅读 · 0 评论 -
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路(2种)分治法,求左子树的深度和右子树深度的最大值,采用递归的方法层次遍历,一层一层的加得到深度此题目和我昨天做的差不多,点击这里看另一道相似题目,所以我很快用下面的第二种层次遍历的方法做出来了,现在我发现这种二叉树的题目大部分是可以用遍历的方法解决的代码(2种)1. 分治法,求左子树的深度和右子树深度的最大值,采用递归的方法/*struct TreeNo原创 2021-01-23 20:52:13 · 594 阅读 · 0 评论 -
操作给定的二叉树,将其变换为源二叉树的镜像的多种方法多种题解(已通过)
文章目录题目及分析思路(2种)代码(2个)1. 在原有的树上直接将所有左右子树节点交换2. 重新遍历生成一颗树,这棵树刚好是原来的镜像题目及分析操作给定的二叉树,将其变换为源二叉树的镜像。分析:就是将二叉树的所有左右子树节点交换过来就可以了思路(2种)这里思路可以有以下两种在原有的树上直接将所有左右子树节点交换重新遍历生成一颗树,这棵树刚好是原来的镜像代码(2个)1. 在原有的树上直接将所有左右子树节点交换递归的方法很是简便,但是需要注意的是在有些地方会ac不了,毕竟很耗内存原创 2021-01-22 11:15:11 · 409 阅读 · 0 评论 -
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。js代码已通过
文章目录算法题目思路js代码算法题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路假设推入1,2,3,4这几个元素进栈,那么栈顶元素是4,栈底是1将stack1的所有元素推到stack2中,此时stack2中的栈顶是1,栈底是4。此时将stack2的1 pop出来,刚好就满足了队列元素的先进先出的特性最后将stack2的退回到stack1js代码var stack1 = []var stack2 = []function push(原创 2021-01-21 11:49:12 · 373 阅读 · 0 评论 -
记一次项目实践为了显示antd的树状table将json数据转化为树状形式
一开始的数据是这样的为了使table能显示子节点 所以要重新数据处理处理算法如下// import Menu from "@/services/menu"import { map } from "lodash"function getMenuData(data) { console.log(data); if (data[0].level === undefined) { const rows = map(data, (item, index) => (原创 2020-07-23 19:23:37 · 579 阅读 · 0 评论 -
动态规划之背包问题
文章目录01背包问题详细图解c语言完整代码01背包问题详细图解c语言完整代码#include <bits/stdc++.h>int max(int a,int b){ if(a>b) return a; else return b;}int main(){ int n,m; int i,j,k; int a[10],b[10]; int f[10][100]; while(scanf("%d%d",&n,&m)&&am原创 2020-05-10 17:54:57 · 132 阅读 · 0 评论 -
回溯和分支限界详解和实例(八皇后问题,哈密顿回路解析和代码)
文章目录回溯和分支限界解决的问题回溯法的内涵回溯法的一些实例n皇后问题哈密顿回路问题子集和数的问题分支限界法实例1:分配工作问题回溯和分支限界解决的问题回溯法的内涵回溯法的一些实例n皇后问题这棵树实际上是对称的所以不用画后面的位于3 4 格开始的情况也可以得到其他解伪代码如下#include <stdio.h>#include <stdlib.h>#include<stdio.h>#include<math.h>int x原创 2020-05-10 12:34:23 · 1915 阅读 · 1 评论 -
两点之间最短路径的计算-floyd算法详
两点之间最短路径的计算-floyd算法Floyd算法的核心内容算法过程图解伪代码完整代码void floyd(){ for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j...原创 2020-05-03 11:20:04 · 1186 阅读 · 0 评论 -
动态规划之有向图传递闭包的计算warshall算法图解详
了解动态规划有向图传递闭包的计算-warshall算法传递闭包的具体计算过程图解warshall算法的核心内容算法的求解过程伪代码具体代码实现#include<bits/stdc++.h>#include<stdio.h>#include<iostream>#include<string.h>using na...原创 2020-05-03 11:12:41 · 2845 阅读 · 0 评论 -
用c语言写Horspool(字符串匹配)算法
完整代码#include <stdio.h>int table[26];//初始化 移动表 char init(char p[],int m){ for(int i=0;i<26;i++) { table[i]=0; } for(char i='A';i<='Z';i=i+1) { for(int j=0;j<m;j++) { ...原创 2020-04-11 09:43:06 · 752 阅读 · 1 评论 -
最详细的图解二叉排序树和平衡二叉树(定义,区别,构造)
二叉排序树(又称二叉查找树)即左子树要比根大,而右子树要比根小这棵树最好的情况就是形成一颗完全二叉树这时候,他的高度是最低的,最多要查找的次数也是最少的,最差的情况就是高度为n(刚好n是所有节点数),完全就是一个线性结构的时候这里就引出了平衡二叉树二叉平衡树实际上是对不平衡的二叉排序树进行处理如果不平衡要怎么办–进行平衡化处理例子上图从宏观上看:e的根节点会变成他的...原创 2020-04-01 10:02:21 · 3278 阅读 · 3 评论 -
堆和堆排序
堆和堆排序什么是堆如下图所以只有第一个是堆,第二个不是完全二叉树,第三个不具备父母优势怎么构造堆堆排序伪代码具体算法void sift(RecType R[],int low,int high){int i=low,j=2*i;RecType tmp=R[i];while(j<=high){if(j<high&&R[j].k...原创 2020-04-01 09:14:34 · 163 阅读 · 0 评论 -
全排列(深度优先搜索+递归)
题目题目描述输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。输入格式n(1≤n≤9)输出格式由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个常宽。输入输出样例输入 #1 复制3输出 #1 复制1 2 31 3 22 1 32 3 13 1 2...原创 2019-08-08 15:48:12 · 218 阅读 · 0 评论 -
分治法分析归并 算法
分治法的定义两个注意点减治法和分治法对比分析一下归并排序分治法的最关键的步骤是合并这里合并的最好情况是 左边的一组元素比右边的都小或都大 — 对应比较n/2次合并的最坏情况是两个序列中交替出现数据大小— 对应比较n-1次...原创 2020-03-02 09:04:29 · 123 阅读 · 0 评论 -
差消法化简高阶递推方程
快速排序快速排序详解分析输入情况解释一下下表:如果选取的排序划分标准元素在第一位1,那么子问题1的规模为0,子问题2的规模为n-1.依次可解析下标工作量利用差消化简解高阶方程左边减左边,右边减右边...原创 2020-02-29 10:54:42 · 360 阅读 · 0 评论 -
迭代法求解递推方程,
步骤1,不断用递推方程的又不的替换左部2,每次替换,随着n的降低在和式中多出一项3,知道出现处置停止替代4 ,将处置带入并对和式求和**5,可用数学归纳法验证解的正确性 **汉诺塔方程插入排序方程换元迭代将对n的递推式换成对其他变元K的递推式,对k递推例:二分归并算法...原创 2020-02-29 10:29:58 · 1667 阅读 · 0 评论 -
c语言完整插入排序
#include <stdio.h>int insert(int a[],int n){ int i,j; for(i=1;i<n;i++) { if(a[i]<a[i-1]) { int t=a[i]; for(j=i;j>=0;j--) { if(j>0&&a[j-1]>t) { ...原创 2020-02-17 12:29:08 · 218 阅读 · 0 评论 -
二叉树的层次,中序,先序,中序,后序遍历的递归和非递归算法以及查询二叉树的祖先节点的算法,查询小写字母的个数
#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node { ElemType data; //数据元素 struct node *lchild; //指向左孩子节点 struct node *rchild; //指...原创 2019-12-23 11:20:40 · 265 阅读 · 0 评论 -
链式队列初始化,创建,插入,删除,查找等基本算法(出自李春葆数据结构)
//文件名:algo3-4.cpp#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct qnode{ ElemType data; struct qnode *next;} QNode;/*typedef struct{ QNode *front; QNod...原创 2019-12-23 11:13:47 · 484 阅读 · 0 评论 -
顺序队列的初始化,创建,插入,删除,查找等基本算法(出自李春葆数据结构)
//文件名:algo3-3.cpp#include <stdio.h>#include <malloc.h>#define MaxSize 5typedef char ElemType;typedef struct { ElemType data[MaxSize]; int front,rear; //队首和队尾指针} SqQueue;void Ini...原创 2019-12-23 11:09:53 · 527 阅读 · 0 评论 -
链栈的初始化,创建,插入,删除,查找等基本算法(出自李春葆数据结构)
//文件名:algo3-2.cpp#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct linknode{ ElemType data; //数据域 struct linknode *next; //指针域} LiStack;void InitStack(...原创 2019-12-23 11:06:45 · 868 阅读 · 0 评论 -
双链表的元素排序,双链表的的所有基本算法(初始化,创建,插入,删除,查找等)(李春葆版)
//文件名:algo2-3.cpp#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct DNode //定义双链表结点类型{ ElemType data; struct DNode *prior; //指向前驱结点 struct DNode *next; El...原创 2019-12-23 11:00:46 · 417 阅读 · 0 评论 -
头插法和尾插法创建单链表,及其单链表的所有基本算法(初始化,创建,插入,删除,查找等)(李春葆版)
//文件名:algo2-2.cpp#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct LNode //定义单链表结点类型{ ElemType data; struct LNode *next;} LinkList;void InitList(LinkLis...原创 2019-12-23 10:07:13 · 1043 阅读 · 0 评论 -
快速排序详解
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分(2)将大于等于分解值的数据集中到数组的右边,小于等于分界值的数排到数组的左边(3)然后,左边和右边的数据可进行独立排序,有可以从新设置一个分界值,进行同样的递归操作(4)当递归完成时,排序完成`#include <iostream>#include <algorithm>using namespace...原创 2019-09-01 17:05:53 · 171 阅读 · 0 评论 -
动态规划经典题目加总结
动态规划经典题目加总结动态规划理解:将子问题用递推的方法,并且将中间结果保留以避免重复计算的方法就叫做动态规划,动态规划通常用来求最优解能够用动态规划求最优解的问题必须满足:最优解的每个局部都是最优d的。题一:最长 公共子序列时间限制: 1 Sec 内存限制: 128 MB提交: 202 解决: 79[IDE][提交][状态][讨论版]题目描述我们称序列Z=<z1,z2,…...原创 2019-07-27 09:07:30 · 711 阅读 · 0 评论