摘要:
二进制矩阵,可以选择任意位置进行反转,其周围格子也会跟着反转 求使得矩阵全为0的最少反转次数 ###1. 广度优先搜索 将每个状态转化为字符串进行存储,方便剪枝和压缩 ``` class Solution { public: int m; int n; vector> dir = {{0,0},{1 阅读全文
摘要:
给一系列顶点,计算这些点能组成矩形的最小面积 ###1. 最小面积矩形(列举对角线+哈希) **矩形的边平行于x轴和y轴** 通过双重循环列举对角线顶点,计算满足条件的矩形面积 ``` class Solution { public: int minAreaRect(vector>& points) 阅读全文
摘要:
###一. 基础进阶 ####1. const作用 ``` //定义常量,相比define的字符替换,具有类型安全检测功能,从汇编角度提供的是地址而不是立即数 const int a = 100; //在函数中防止修改,提高程序健壮性 void f(const int i){ i++; }// er 阅读全文
摘要:
一个数组的分数定义为数组之和乘以数组的长度 ###1. 前缀和 + 二分 ``` class Solution { public: long long countSubarrays(vector& nums, long long k) { //注意是正整数数组 int n = nums.size() 阅读全文
摘要:
将数组分为三个部分,每部分对应二进制数值相同 ###1. 三指针 各部分1的数目应当相同,借助这个性质来找三个指针的起始位置 根据最后一个指针起始位置确定串的长度,逐位比较即可 ``` class Solution { public: vector threeEqualParts(vector& a 阅读全文
摘要:
在一颗无向树上青蛙从顶点1起跳,问T秒后停留在目标位置的概率 ###1. 深度优先搜索 问题规模可以进一步递归拆分,概率等于下一个节点到目标概率的平均值 ``` class Solution { public: double frogPosition(int n, vector>& edges, i 阅读全文
摘要:
给你一个n节点的无向带权连通图,同时告诉你边的端点和权值 对于部分权为-1的边,可以进行修改为任意值,最后使得初始点到目标点最短距离为target ###1. Dijkstra 第一次使用迪杰斯特拉算法,将所有能修改的权值视作1,计算到各点的最短距离 判断该距离是否有操作空间,满足要求的情况下计算要 阅读全文
摘要:
给你一棵以 root 为根的 二叉树 ,请你返回任意二叉搜索子树的最大键值和 ###1. 中序遍历+记录多个返回值 ``` class Solution { public: //求子树键值需要后序遍历,判断二叉搜索树需要中序遍历 //判断二叉树也可以用判断左右值加中序遍历的方式,所以这里采用中序遍历 阅读全文
摘要:
**模板** ``` int n = nums.size(); vector left(n, -1); //贡献法记录左辖域,开区间 vector right(n, n); //贡献法记录右辖域,开区间 stack st; //单调栈,降序记录 for(int i=0;i 单调栈+前缀和 ``` c 阅读全文
摘要:
总力量定义为以下两个值的 乘积: 巫师中最弱的能力值 组中所有巫师的个人力量值之和 ###1. 单调栈+前缀和+前缀和 根据单调栈求得每一个值的辖域(当前值为最小值的最长数组范围) 接下来问题就转化成了求在辖域中包含当前值所有子数组的和 求和我们采用前缀和的方式 > 对于abcde,假设c为当前辖域 阅读全文