文章分类 -  算法里的数学

刷题遇到的数学类定理、公式或者解法思路
摘要:原题在这里: 概述题意,要求比O(n)复杂度更好的求出完全二叉树的节点数量的算法。 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullpt 阅读全文
posted @ 2022-05-24 09:17 Renhr 阅读(33) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给定一个m*n的乘法表,问第k小的数字。 analyse: 我就只能想到这个乘法表是主对角线对称,然后就没有然后了,发呆ing。 标准解法: 找第k小的数字->二分查找数字x,利用k对于小于x数的数字进行二分。 每一行i,有min(x/i,n)个小于x的数字,遍历即可 优化, 阅读全文
posted @ 2022-05-18 10:19 Renhr 阅读(104) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给定point二维数组表示点的坐标,问可构成最大三角形面积。 analyse: 没别的,就en算数学,运用行列式转换公式: code: class Solution { double area(int x1, int y1, int x2, int y2, int x3, i 阅读全文
posted @ 2022-05-15 13:10 Renhr 阅读(53) 评论(0) 推荐(0) 编辑
摘要:随便刷几个天梯赛题目。 原题在这里 概述题意,给定完全二叉树的后序遍历,问层序遍历结果。 analyse: 1.刚开始很认真的逆序建树,写得不是很顺畅,因为我不喜欢这种数据关系类型的题目。 code: #include <bits/stdc++.h> using namespace std; #de 阅读全文
posted @ 2022-04-22 21:18 Renhr 阅读(54) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给定一个数组,每次操作能使n-1个数字增加1,问最少多少次能让数组内所有元素相同。 analyse: 这题居然是简单题,我确实没想到,做了很久, 正向思考:每次处理n-1个元素+1 反向思考:每次处理1个元素-1 那么正向加到相同,等于反向减到最小。 code: class 阅读全文
posted @ 2022-04-16 14:57 Renhr 阅读(175) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:给定n,问在[0,10^n)区间范围内有多少个数满足各位上的数都不同。 analyse: 很标准的排列数学题目,但是,但是,但是,我想了很久,甚至百度了排雷组合的公式... 实际上很简单的,因为位数一定不同,那么对于从前往后的可选数字数量数组即为: [9,9,8,7,6,5, 阅读全文
posted @ 2022-04-11 16:59 Renhr 阅读(64) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给定u,v和x,y,问能否通过(u+v,v)or(u,u+v)到达(x,y)。 analyse: 正向搜索肯定是不能的,逆向就很轻松了。 有规律的是: x>y,那么上一步肯定是(x-y,y) x<y,那么上一步肯定是(x,y-x) 特别的,如果有很多连续相同的操作,那么可以优 阅读全文
posted @ 2022-04-09 15:37 Renhr 阅读(27) 评论(0) 推荐(0) 编辑
摘要:原题在这里 概述题意:给一个区间,问区间内有多少个数字的二进制有效位数是质数。 1.因为数据合适,所以直接暴力: class Solution { public: int countPrimeSetBits(int left, int right) { /* 2,3,5,7,11,13 */ int 阅读全文
posted @ 2022-04-05 13:37 Renhr 阅读(152) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述:求区间内所有数字的与运算和 analyse: 因为数据范围是INt_MAX,所以不可能暴力,必须研究数学规律。 mine_直接说了,考虑二进制的每一位,范围为[0,left],当区间端点&y都等于y,且区间长度小于y,那么一定有y。 还有更优解法,但是暂时搁置一下。 code: 阅读全文
posted @ 2022-03-31 12:23 Renhr 阅读(146) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 给定一个长度为[1,1e4]区间内的数组,求第三大数字(不足三则取最大) 然后我wa+wa+wa..... 很无语。。。 算法复杂度为O(2*N),第一遍找最小,然后三个数维护第三大 满足有效更新为(x^y&&y^z)也即xyz三者不互相同,则为z,否则为x code: class S 阅读全文
posted @ 2022-03-30 17:35 Renhr 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述:在给定数组中,求连续子数组为等差数组(len>2)的数量。 analyse: 1.因为数据量很小,所以写了暴力dfs查找 code: class Solution { int ans, l; vector<int> n; vector<vector<int>> m; void d 阅读全文
posted @ 2022-03-30 13:16 Renhr 阅读(57) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:求n范围内的数字中,数字1的个数。 analyse: 我起初做这个题的时候,也是考虑的从每一位数字上去分析这个位能给ans提供多少个1,但终究是太nen了,想得稀奇古怪,不过最后还是瞎捣鼓4小时以后还是ac了,虽然写得很混乱,人也没忍住我老是写错我想要的逻辑,写完连题解都不想 阅读全文
posted @ 2022-03-29 17:04 Renhr 阅读(54) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述:求一个整数n(n>1)划分为k(k>1)份的最大乘积。 analyse: 根据等周长正方形面积一定大于长方形定理(???) 所以,数字n划分方式有两种: 划分为i份等长数字+余数,即ans=pow(i,n/i)*(n%i) 划分为i-1份等值数字+(i+余数),即ans=pow( 阅读全文
posted @ 2022-03-29 12:54 Renhr 阅读(30) 评论(0) 推荐(0) 编辑
摘要:原题在这里。 学习链接在这里。 analyse: 我构思了很久,只能想到用bfs是最好的,但是并不能想到具体每一个变换是怎么处理的(头大) 因为打算系统化学习动态规划篇章,所以现在暂时只学习了一个最简单动态规划版本,是理解了,确实非常巧妙,惊叹ing code: class Solution { p 阅读全文
posted @ 2022-03-28 22:27 Renhr 阅读(24) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意: 给定一个可能有环的链表,如果有环则返回第一个环节点,否则null 低配hash处理: class Solution { map<ListNode *, int> mp; public: ListNode *detectCycle(ListNode *head) { if ( 阅读全文
posted @ 2022-03-28 11:08 Renhr 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 题意就不用多说了。 1.我是通过打表分析出来的由于数据范围是1e4,然后我就写成了这样: return n/5+n/5/5+n/5/5/5+n/5/5/5/5+n/5/5/5/5/5; 然后AC了 标准代码: class Solution { public: int trailingZ 阅读全文
posted @ 2022-03-25 12:51 Renhr 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意:给定数字n,在数字范围[1,n]中,找到根据字典序的第K小数字。 我首先想到的是构造,然后构造构造着就变成了dfs暴力(指严严实实地从第1小找到第k小) 然后因为1<=k<=n<=1e9,所以T了,然后就是考虑剪枝优化 因为时间关系就没考虑怎么剪枝了,直接看了题解,下次再做吧 阅读全文
posted @ 2022-03-23 22:19 Renhr 阅读(52) 评论(0) 推荐(0) 编辑
摘要:原题在这里: 概述题意,给一个数组,求填平数组(凹处的高低差)所需面积。 想过双指针两端考虑高点收缩; 想过从每一个高度入手; 也想过单调栈(但没想明白怎么用)。 然后debug一个小时用了一个自己的解法: 去重找峰值,删除峰的凹峰【此后数组类型就是(递增+)递减了】,然后遍历。 class Sol 阅读全文
posted @ 2022-03-17 21:20 Renhr 阅读(84) 评论(0) 推荐(0) 编辑
摘要:本来是一道很普通的水题,但是水出了质量。 一个矩阵元素满足,左->右 and 上->下 递增,问是否含有target数值。 暴力搜索(python): class Solution: def searchMatrix(self, matrix: list[list[int]], target: in 阅读全文
posted @ 2022-03-16 17:14 Renhr 阅读(35) 评论(0) 推荐(0) 编辑
摘要:原题在这里 概述题意: 给定一个数组a,定义ans=(l-r)*min(a[l],a[r]),(l>r),问最大ans。 很直挂的思路是O(n^2)的暴力遍历,但是本题n<=1e5 我原来的思路是, 根据公式有,l-r,当双指针向内收缩的时候,l-r的数值是固定不变的-1, 所以只需考虑怎么移动双指 阅读全文
posted @ 2022-03-15 19:43 Renhr 阅读(22) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示