![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
爱学习的阿强
这个作者很懒,什么都没留下…
展开
-
小米笔试题——01背包问题变种
这段代码的主要思路是使用动态规划来构建一个二维数组 dp,其中 dp[i][j] 表示前 i 个产品是否可以组合出金额 j。通过遍历产品列表和可能的目标金额,不断更新 dp 数组中的值,最终返回 dp[N][M] 来判断是否可以组合出目标金额 M。如果 dp[N][M] 为 true,则表示可以组合出目标金额,否则表示无法组合出目标金额。原创 2023-09-22 21:07:24 · 443 阅读 · 0 评论 -
最长公共子数组
leetcode718. 最长重复子数组原创 2023-01-13 17:00:05 · 490 阅读 · 0 评论 -
黄油运输的迷思
他突发奇想,要这一切都是标准化包装物件,那么其尺寸不仅节约控件、提升干线物流运输效率,同时也让简化车辆的动力学、运动学建模,帮助自动驾驶算法更精准、灵敏地操控车辆(但愿如此)。如果最后一个箱子的长度为 1 米,那么前面的 i-1 米长度的队列可以有 dp[i-1] 种不同的排列方式。如果最后一个箱子的长度为 2 米,那么前面的 i-2 米长度的队列可以有 dp[i-2] 种不同的排列方式。如果现有两种包装物品的包装运输箱,尺寸分别是长宽 1米×1米 和 1米×2米。对于长度为 i 米的队列,我们可以。原创 2023-07-18 14:06:55 · 191 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]当向上遍历时,其实是从左到右遍历列。当向右遍历时,其实是从上到下遍历行。输出:[1,2,3,4,8,12,11,10,9,5,6,7]原创 2023-07-18 11:19:33 · 906 阅读 · 0 评论 -
DP——最长上升序列
#include<iostream>using namespace std;int main(){ int N; cin>>N; int a[N]; for(int i=0;i<N;i++){ cin>>a[i]; } int maxl=0; int dp[N]; dp[0]=1; for(int i=1;i<N;i++){ dp[i]=1; .原创 2020-12-15 19:01:04 · 78 阅读 · 0 评论 -
DP状态机——股票问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201212203733615.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdxaWFuZzE5OTc=,size_16,color_FFFFFF,t_70class Solution {public: int maxProfit(in...原创 2020-12-12 20:42:00 · 164 阅读 · 0 评论 -
区间DP——股票问题系列
算法思想:通过分析最大利润等于,max{a[i]-min{a[j]}} (j<i)遍历数组,同时记录最小值min,每次与min作差,最大差则为最大利润。class Solution {public: int maxProfit(vector<int>& prices) { if(prices.empty()){ return 0; } int maxPro=0; int min=p原创 2020-12-12 19:30:33 · 59 阅读 · 0 评论 -
分支限界——最大团问题
给定有一个无向图,找出最大团个数。最大团也就是该图中最大的完全图(各顶点之间都有边)。算法思想:设p为所有点集的集合,依次取出p中的顶点作为团的起始点,也就是以该点为起点开始拓展,每次查看相邻顶点是否与团内各点联通,若true,则加入该点。为了进一步降低时间复杂度,采取记忆化递归的方式,从后向前遍历顶点,用cnt数组记录该点以后所成最大团的个数,以此知该点的潜力,达到剪枝的效果。#include<bits/stdc++.h>using namespace std;#define.原创 2020-12-10 16:37:39 · 5118 阅读 · 1 评论 -
BFS——二分图判断
算法思想:BFS给所有顶点染色,相邻顶点染不同颜色,染过的顶点检查与相邻顶点是否颜色不同。#include<iostream>#include<queue>#include<string.h>using namespace std;const int N=1e4;int color[N],graph[N][N];bool bfs(int s,int n){ queue<int> q; q.push(s); color.原创 2020-12-10 15:24:14 · 809 阅读 · 0 评论 -
DFS——黑色瓷砖
算法思想:其实就是dfs,注意每次访问过的黑色瓷砖标记成白色瓷砖,return向四个方向展开。int digui(int x, int y, char array[][6]) { if (x < 0 || x >= 5 || y < 0 || y >= 5) { return 0; } if (array[x][y] == '#') { return 0; } else {//要么写else,要么写if(array[x][y]=='.'||array[x][y..原创 2020-12-10 14:54:30 · 211 阅读 · 0 评论 -
回溯法——解数独
其实和迷宫问题类似思想都是填写每个位置如果重复换数字,填不下去了就回溯,但是这个题目有两个难点:1.如果判断横方向竖方向还有,9宫格里面是否重复,判断比较难。2.迷宫问题只有方向4个状态量,可是解数独状态量有填写9个数字加上4个方向,两组状态量,递归体怎么填写是很困难的。①先说判断②再说两组状态量一开始我尝试代码,这种形式for(1~9尝试) for(四个方向遍历) dfs()但是这样做会有一个很大的问题,你不知道递归终止的条件,什么意思?下面这段代码演示四个方向递归的搜索过程,假原创 2020-12-05 16:08:02 · 330 阅读 · 0 评论 -
回溯法——力扣51. N 皇后
算法思想:开辟两个二数组queen和attack。queen表示棋盘,queen[i][j]=‘Q’则表示当前位置放置皇后,如果queen[i][j]=‘.’表示未放置皇后。attack表示皇后攻击范围,attack[i][j]=1表示当前位置在皇后攻击范围内,attack[i][j]=0表示当前位置不在皇后攻击范围内。从第一行开始尝试放置皇后,如果当前格子不在攻击范围内,则放置,否则尝试下一个位置,如果任意一行8个位置都无法放置皇后则返回,回溯。如果8行都尝试完毕,则结束递归,记录当前的方案。原创 2020-12-05 15:26:42 · 178 阅读 · 0 评论 -
回溯法——23. 矩阵中的路径
算法思想:尝试迷宫的每个位置作为起点,进行深度优先搜索,给每次搜索计数为u,如果matrix[x][y]=str[u],则u+1,匹配失败returnfalse,如果u=str。size()-1表示匹配完成,return true。如果所有位置都尝试未成功,则return false。class Solution {public: bool hasPath(vector<vector<char>>& matrix, string &str) { .原创 2020-12-05 15:13:13 · 78 阅读 · 0 评论 -
贪心算法——小船过河
题意:N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同t[i],每次过河的时间为船上的人的较慢的那个,问最快的过河时间。(船划过去要有一个人划回来)#include<iostream>#include<algorithm>using namespace std;int mintime(int t[], int n) { sort(t, t + n); int sum = 0; int i; if (n > 2) { for (i = n;.原创 2020-11-27 15:24:40 · 4598 阅读 · 1 评论 -
ACWing902. 最短编辑距离
#include<iostream>#include<algorithm>using namespace std;const int N=1010;int dp[N][N];int la;string a;int lb;string b;int main(){ cin>>la; cin>>a; cin>>lb; cin>>b; for(int i=0;i<=la;i+.原创 2020-11-21 19:55:47 · 119 阅读 · 0 评论 -
打印x的所有祖先结点
算法思想:采用后序非递归遍历,访问到值为x的结点时,栈中所有元素均为该节点的祖先节点。 void postorderTraversal(TreeNode* root) { TreeNode *r; TreeNode *p=root; stack<TreeNode*> s; while(!s.empty()||p){ if(p){ s.push(p);原创 2020-11-21 17:34:01 · 1168 阅读 · 0 评论 -
Acwing 896. 最长上升子序列 II
不用DP,有点巧妙。算法思想:维护一个单调递增的数组。数组a[i]表示长度为i的子序列的最后一个元素是a[i].当我们求最长子序列的时候,比方说,{1,3,5}和{1,3,4}这两个子序列长度都是3,但是4比5小所以4的适用范围比5要大,比方说{1,3,4,5}可以构成长度为4的子序列,而{1,3,5,5}却不行。所以我们要尽可能的使最后一个元素小。#include<iostream>#include<stack>#include<vector>using原创 2020-11-21 16:50:39 · 120 阅读 · 0 评论 -
贪心算法——区间选点
感觉和活动安排很类似。算法思想:将区间按照右端点大小从小到大排列,用res记录取点数,遍历区间每次取区间的右端点如果和下个区间不相交,则res++。//将每个区间按照右端点从小到大排序//依次遍历每个区间选择右端点#include<iostream>#include<algorithm>using namespace std;const int N=100010;struct Range{ int l,r;}range[N];bool comp(Ran原创 2020-11-21 16:35:46 · 243 阅读 · 0 评论 -
第一个只出现一次的字符
char firstUniqChar(string s) { unordered_map <char,int>m; for(auto c:s){ if(m.find(c)==m.end()){ m.insert(pair<char,int>(c,1)); }else{ m[c]++; } } ...原创 2020-11-09 16:26:32 · 60 阅读 · 0 评论 -
字符串子串截取
1.统计子串次数每次都去找子串,然后把字符串按本次找到的子串进行切割,对剩下的部分继续寻找子串//统计子串出现次数//每次都去找子串,然后把字符串按本次找到的子串进行切割,对剩下的部分继续寻找子串string str;getline(cin, str);int tmp = 0;int count = 0;int index = str.find("yang");while (str.find("yang") != -1) { count++; str=str.substr(str.fi原创 2020-11-04 16:43:08 · 1103 阅读 · 0 评论 -
背包DP——背包问题
给定背包容量C=9,给定四个物品与价值,能装入的最大价值是多少?物品重量w = { 2,3,4,5 };物品价值v = { 3,4,6,6 };dp[i][j]表示对前i种物品,背包容量为j能装入的最大价值。对于第i+1个物品,可以选择装或者不装两种情况int backpack(vector<int> w, vector<int> v) { int c = 0; cin >> c; int n = w.size(); vector<vecto.原创 2020-10-18 11:54:58 · 470 阅读 · 0 评论 -
n皇后问题
算法思想:定义一个二维数组attack,0表示可以放置皇后不会被攻击,1表示不可以放置皇后会被攻击。定义一个二维数组queen记录皇后放置的位置,Q代表放置,代表空格。 //从第0行开始尝试放置皇后,如果当前位置attack=0则放置,先备份attack,然后更新,尝试下一行皇后放置,如果尝试结束则恢复attack,恢复取消当前位置的放置,如果n行尝试结束,则记录解法。更新八个方向的方法,记一下用两个for循环+idx[],+idy[],设置一下边界,一开始用递归写了,因为会递归会有很多重复搜索,导致超时原创 2020-10-06 20:55:22 · 89 阅读 · 0 评论 -
回溯法——图m染色问题
给定无向连通图G和m种颜色,要求用这些颜色给定点着色要求,每个顶点颜色和相邻顶点不相同。算法思想:深度搜索尝试每个顶点,使用每一种颜色的可能,每次添加颜色的时候检查新添加结点是否与相邻结点颜色相同。如果相邻顶点颜色相同则剪枝不再尝试,否则继续尝试下一个顶点,如果所有顶点都染完颜色,就输出结果。#include<iostream>#include<vector>using namespace std;//给定无向连通图G和m种颜色,要求用这些颜色给定点着色要求,每个顶点颜.原创 2020-10-05 20:43:30 · 339 阅读 · 0 评论 -
回溯法——装载问题
有n个集装箱要装上载重量为w的轮船,其中集装箱i的重量为wi。不考虑集装箱体积的限制,现在要将若干集装箱装上轮船,使他们的总重量为w,如果总重量相同要尽可能的使用少的集装箱。有n个集装箱要装上载重量为C1、C2的轮船,其中集装箱i的重量为wi。问两艘轮船能否装下所有集装箱。深搜所有情况,重点是要剪枝。题目一剪枝条件是,tw + w[i] <= weight && tw + rw >= weight。当前集装箱装入后是否超过最大载重量,当前集装箱总重加上剩下集装箱总重.原创 2020-10-05 19:01:11 · 1082 阅读 · 0 评论 -
贪心算法——作业调度
算法思想:长作业优先,先把作业分配给每台处理机,剩下的优先分配给先空闲的处理机。#include<iostream>#include<algorithm>#include<vector>using namespace std;struct job { int id; int costtime;};bool cmp(job a, job b) { return a.costtime > b.costtime;}int Greedy(vector原创 2020-10-05 15:05:35 · 3038 阅读 · 1 评论 -
贪心算法——活动安排问题
给定n个活动,包括编号、开始时间、结束时间,活动都要占用一个公共资源,如教室,同一时间只有一个活动可以使用,请问同一天最多安排多少个活动?算法思想:1.将活动按照结束时间递增排序。2.选择活动开始时间尽可能早的活动。3.活动的开始时间必须大于上个活动结束时间。#include<iostream>#include<algorithm>using namespace std;struct Activity { int num, start, end, mark;};boo原创 2020-10-05 12:57:43 · 2074 阅读 · 0 评论 -
动态规划最大字段和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为6。class Solution {public: int maxSubArray(vector<int>& nums) { int n=nums.size(); vector&l原创 2020-10-03 15:19:50 · 290 阅读 · 0 评论 -
力扣1143. 最长公共子序列 动态规划之最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = “abcde”, text2 = “ace原创 2020-10-03 14:25:23 · 267 阅读 · 0 评论 -
动态规划之背包问题
现有n个物品,背包总容量为c,每个物品只有1件数,背包最多能装入价值为多少的物品?举例:物品编号 1,2,3,4物品体积 2,3,4,5物品价值 3,4,5,6最大价值为10,即选取2号物品和4号物品int w[] = { 2,3,4,5 };int v[] = { 3,4,5,6 };int backpack(int n, int c, int w[], int v[]) { vector<vector<int>> dp(n+1, vector<int&.原创 2020-10-02 18:56:31 · 123 阅读 · 0 评论 -
分支界限和回溯法的区别
https://www.cnblogs.com/mdumpling/p/7874539.html如有侵权,联系删除!转载 2020-09-25 14:14:11 · 503 阅读 · 0 评论 -
分治法——线性时间选择
算法思想:利用快速排序的方法将a[p:r]被划分成两个子数组a[p:i]和a[i+1:r],使a[p:i]中的每个元素都不大于a[i+1:r]中每个元素。接着算法计算子数组a[p:i]中元素个数j。如果k≤j,则第k小的数落在左区间,否则落在右区间,直到k=j时,找到第k小的数。对于有重复数字的无法解决。其实维护小顶堆感觉更好,无论时间复杂度还是代码复杂程度。int Partiotion(int a[], int p, int r) { int i = p; int j = r + 1; int原创 2020-09-19 21:21:53 · 309 阅读 · 0 评论 -
分治算法——棋盘覆盖
//算法思想:当k=0时,及特殊方格,骨牌数为1.//当k>0时,将2的k次方*2的k次方棋盘划分为4个较小的棋盘,而其余三个子棋盘中无特殊方格。//继续递归成4个较小的棋盘。//用L型骨牌覆盖在3个子棋盘汇合处。int tile = 1;int Board[8][8];void ChessBoard(int tr, int tc, int dr, int dc, int size) { //tr棋盘左上角方格的行号 //tc棋盘左上角方格的列号 //dr特殊方格的行号 //dc特原创 2020-09-19 18:49:21 · 290 阅读 · 0 评论 -
快速排序及优化
int Partiotion(int A[], int low, int high) { int pivot = A[low]; while (low < high) { while (low < high && A[high] >= pivot)--high; A[low] = A[high]; while (low < high && A[low] <= pivot)++low; A[high] = A[low]; }原创 2020-09-19 14:53:22 · 138 阅读 · 0 评论 -
折半查找
int BinarySearch(int a[], const int& x, int n) { int left = 0; int right = n - 1; while (left <= right) {//注意是小于等于 int mid = (left + right) / 2; if (a[mid] < x) {//比查找元素小,查找元素在右区间 left = mid + 1; } if (a[mid] > x) { right = mi原创 2020-09-16 21:02:56 · 50 阅读 · 0 评论 -
力扣46.全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1],[3,1,2], [3,2,1] ]链接:https://leetcode-cn.com/problems/permutations简化一下这道题,改成输出所有全排列结果。这道题无论你说用递归、分治、DFS还是回溯其实都是一个意思。都是在做一件事情那就遍历这个问题的搜索树。输入1,2,3情况下的求解树,如.原创 2020-09-12 14:44:45 · 210 阅读 · 0 评论 -
力扣877. 石子游戏思路
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。示例:输入:[5,3,4,5] 输出:true 解释: 亚历克斯先开始,只能拿前.原创 2020-07-12 16:56:47 · 288 阅读 · 0 评论