随笔分类 - 解题汇总
算法题解题汇总
摘要:搜索解空间: 1、约束条件: 只要第t个结点和前t-1个结点中被选中的结点都有边相连,则放入团中,否则不能放入 2、限界条件: 当第t个结点不能放入团中时,要判断假设下面的n-t个结点全放入团中加上当前以及放入的结点cn个的和:cn+n-t是否大于最优值bestn,若大于,则有必要继续搜索; 若小于
阅读全文
摘要:本题利用dfs将一整座岛屿找出来,所以我们每在首函数里调用一次dfs函数,就是一座新岛屿,岛屿数量加1 在dfs函数里运用“感染”一词来寻找相连的区域 1 class Solution { 2 public: 3 int ans=0; 4 int numIslands(vector<vector<c
阅读全文
摘要:本题计算最大的岛屿面积,我们用dfs来深搜每个岛,并在每次dfs之前定义s来计算每个岛的面积,并同时更新最大值,我们将地图二维数组和每个点的x、y和s传入dfs函数,在第一个函数里的每一次dfs,就是一座新的岛屿 在dfs中我们进行点的不合法判断且回溯,并修改遍历过的1改为0,然后将此岛屿面积s++
阅读全文
摘要:dfs是最广泛的搜索算法,通俗讲就是:一条路走到黑,通过暴力枚举,将所有可能的情况一一枚举,不断地试探来找到解 对每一个可能的分支路径深入到不能再深入,而且每个顶点只访问一次。 dfs一般借助递归来实现: 1 void dfs(int deep){ 2 if(到达边界){ 3 //做一些处理后返回
阅读全文
摘要:由BFS得到的层序结果是一个一位数组,而我们要得到二维数组,则需要: 在每一层遍历开始前,先记录队列中的 结点数量 n(也就是这一层的结点数量),然后一口气处理完这一层的 n 个结点。 在while循环的每一轮,都是将当前层的结点全部出队,再将下一层的所有结点入队,就实现了层次遍历 1 /** 2
阅读全文
摘要:力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个 警告 。 给你字符串数组 keyName 和 keyTime ,其中 [keyName[i], keyTim
阅读全文
摘要:合并二叉树,叶子叠加合并 创建新的root结点,一个一个的将两颗二叉树的结点叠加起来 1 class Solution { 2 public: 3 TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { 4 if(!t1&&!t2){ 5 return
阅读全文
摘要:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 解题思路:dfs深度优先遍历搜索,本质是搜索叶子结点,边搜索边更新tmp的值——不是叶子结点就将tm
阅读全文
摘要:给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积为正数的最长子数组长度。 动态规划求解,根据当前元素来填正负dp表的状态 1 class Solution { 2 public: 3 /* 初始化 po
阅读全文
摘要:给你一个正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。 模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。 如果数组中存在至少重复 k 次且长度为 m 的模式,则返回 true ,否则返回 false 。 解
阅读全文
摘要:有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续)。Alice 将会取走硬币数量最多的那一堆。你将会取走硬币数量第二多的那一堆。Bob 将会取走最后一堆。重复这个过程,直到没有更多硬币。给你一个整数数组 piles ,其中 pile
阅读全文
摘要:给你一个 有向无环图 , n 个节点编号为 0 到 n-1 ,以及一个边数组 edges ,其中 edges[i] = [fromi, toi] 表示一条从点 fromi 到点 toi 的有向边。 找到最小的点集使得从这些点出发能到达图中所有点。题目保证解存在且唯一。 你可以以任意顺序返回这些节点编
阅读全文
摘要:1 /* 2 整体思路: 3 枚举所有四位数,并将所有可颠倒且颠倒后合法(不以0开头)的四位数找出来,然后 4 将其与原本数字做差,将<原数,颠倒数,差>作为一个price结构体数据类型存入两个动态数组vector 5 然后遍历两个vector,双层for循环求和,用两个的vector的diff加起
阅读全文
摘要:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 思路:从最后一位看,若不为9,则加1直接返回 若为9,则本位设为0,继续遍历前一个数; 若跳出for循环,则说明数组
阅读全文
摘要:比较两个版本号 version1 和 version2。如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。 你可以假设版本字符串非空,并且只包含数字和 . 字符。 . 字符不代表小数点,而是用于分隔数字序列。 例如,
阅读全文
摘要:解题思路:我们将二进制串按照字符分组,例如00111011可以分为{2,3,1,2} 我们只需看相邻的数字中,取min(u,v)即可,我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。 统计出个数后, 对于每个个数只关心它前面的值,所以使用last来存储前面的cnt,一次次将min加入结果
阅读全文
摘要:1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 int n=0;//n皇后 5 int ans=0;//解个数 6 bool hashTable[20]={false};//列是否被占有 7 bool xy[20]
阅读全文
摘要:将相同字符统计出个数放在字符后,原地修改 解题思路:双指针做法,read和write指针 1 class Solution { 2 public int compress(char[] chars) { 3 int write=0;//写指针 4 int anchor=0;//指向连续字符的第一个
阅读全文
摘要:蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,蒜头君手上有长度为 11,22,33,33 的4根木棍,他可以让长度为11,22 的木棍组成一条边,另外 22 跟分别组成 22 条边,拼成一个边长为 33 的等边三角形。蒜头君希望你提前告诉他
阅读全文
摘要:解题思路: 1.先将表达式里的减号“-”用replaceAll全换成“+-”,可以简化减号和加号运算 2.将方程式以=分为左右两个式子后,再将两个式子以“+”号分割成两个字符串数组leftArray和rightArray来进行cal计算 3.将每个式子的x的系数和常数d的系数以cal方法计算出来,
阅读全文

浙公网安备 33010602011771号