Math
Lzed
我好菜啊
展开
-
Leetcode 523 - Continuous Subarray Sum(Math)
题意给一个由非负正数组成的数组和一个数k,要求在数组中找一段长度≥2\geq 2的序列使其和是k的整数倍。思路算法1O(n2)O(n^2)时间,O(n)O(n)空间维护数组的前缀和ss,对于当前sis_i,遍历sis_i之间是否存在一个sjs_j满足(si−sj)%k=0k≠0(s_i - s_j) \% k = 0 \quad k \neq 0注意k=0k = 0的情况。算法2如果要求和刚好为k的原创 2017-02-28 11:02:12 · 1043 阅读 · 0 评论 -
Kickstart 2017 Round A - A.Square Counting(Math)
题目链接https://code.google.com/codejam/contest/8284486/dashboard题意给一个m⋅nm \cdot n的格点图,求这个格点图中正方形的数目。思路包括正正方形和斜正方形。正正方形数目我们用f(i)f(i)表示边长为ii的正方形数目。明显可知f(1)=mnf(1) = mn,我们推一下f(2),f(3)...f(2), f(3) ...。设如下格点图原创 2017-03-07 08:47:16 · 442 阅读 · 0 评论 -
Leetcode 224 - Basic Calculator(表达式求值1)
题意表达式求值,只含有+, -, (, )。思路转逆波兰表示后求值。转逆波兰的过程:扫描字符串,如果是数字直接输出如果是),那么一直出栈到遇到(。 如果是运算符,比较当前运算符op和栈顶运算符top的优先级,如果top≥optop \geq op,那么出栈直到上述条件不满足。将op放到栈里面。在处理数字的过程中,注意空格的处理。代码class Solution {public: i原创 2017-03-05 20:07:57 · 294 阅读 · 0 评论 -
Leetcode 2 - Add Two Numbers(链表求和)
题意给定两个链表,代表数字的相反次序,求这两个链表加起来的和。用链表存储结果。思路算法1在原来的位置上存储,利用原来的空间,于是需要判断一下哪个链表先到终点等。算法2很简洁的一个写法,我们假设链表的长度相同,如果一个为空了我们认为是0。并且,在处理头结点的时候,我们刚开始新建一个不用的头结点p,每次求和的值保存在p->next = new ListNode(val)。最后结果将p后移一位即可。代码a原创 2017-03-06 08:56:59 · 214 阅读 · 0 评论 -
Leetcode 223 - Rectangle Area(矩形面积交)
题意两个和坐标轴平行的矩形,可能相交,求这两个矩形的总面积。思路关键是确定相交矩形的面积,我们可以通过确定四个顶点,也可以通过长和宽。算法1通过确定四个顶点(实际上是4条边的位置,最上面的边,最下面的边,最左边的边,最右边的边)。我们两个矩形的位置实际上就三种:相交,相离,包含。如图:所以,我们最后确定的矩形的四条边的位置如上图所示,最后,只要r>lr > l且u>du > d的时候代表有重叠面积。原创 2017-03-06 11:00:02 · 353 阅读 · 0 评论 -
Leetcode 149 - Max Points on a Line(Math)
题意一个2D平面内有若干个点,找一条直线使之穿过的点数最多,求最多穿过的点数。思路首先,我们先从一般情况考虑,假设我们当前直线已经穿过一个点(a,b)(a, b)了,那么只需要枚举剩下的点p(x,y)p(x, y),并且建立map[x - a / y - b]穿过点数的映射即可。那么,我们这道题只需要枚举直线穿过的点,然后再遍历剩下的点求斜率并且统计就好。在求斜率的时候,假设我们当前直线起点为(a,原创 2017-03-07 09:00:34 · 251 阅读 · 0 评论 -
Leetcode 201 - Bitwise AND of Numbers Range(bit & math)
题意给定两个数m和n,并且m≤nm \leq n,求f(m, n) = m & (m + 1) & (m + 2) & ... & n的值。思路算法1我们知道,在范围[m,n][m, n]内,对于二进制表示的第i位,只要这个范围内有一个数的第i位为0,那么我们结果f(m,n)f(m, n)的第i位就为0。那么,如果m的第i位是1,并且之后[m,n][m, n]范围内的所有数第i位都是1,那么我们最后原创 2017-03-10 17:45:04 · 263 阅读 · 0 评论 -
Leetcode 492 - Construct the Rectangle(Math)
题意给一个面积area(≥1e8)\geq 1e8),要求找一个长为L,宽为W的矩阵,使满足:W⋅L=areaW \cdot L = areaL≥WL \geq WL−WL - W最小思路要是L和W尽可能接近一定是area−−−−√\sqrt{area}了。所以我们从00到area−−−−√\sqrt{area}枚举宽W,找到能满足整除且最大的那个W即可。时间复杂度O(n√)O(\sqrt{原创 2017-03-11 17:40:39 · 211 阅读 · 0 评论 -
Leetcode 204 - Count Primes(素数筛法)
题意计算小于n的整数中素数的个数。思路算法1埃氏筛(Eratosthenes),时间复杂度O(nloglogn)O(nloglogn)。从2开始,每个素数的整数倍都是合数。并且每个合数都是优化:若i是素数,从i∗ii * i开始筛除合数而不是i∗2i * 2wiki: https://zh.wikipedia.org/wiki/%E5%9F%83%E6%8B%89%E6%89%98%E6%96%AF原创 2017-03-02 20:45:02 · 301 阅读 · 0 评论 -
Leetcode 43 - Multiply Strings(高精度乘)
题意实现高精度乘法。思路模拟即可,但是模拟也是有方法的。算法1直接像我们手算乘法一样模拟,每次计算出来的一位都要保证小于10并且记录进位。过程如下:算法2比算法1简单很多。还是像手算乘法一样,但是比如我们算出来某一位相乘大于等于10后,我们不进位,直接保留结果,在最后的时候再统一进位。还是上面那个例子:时间复杂度:O(mn)O(mn)(其中m和n分别是两个字符串的长度)代码algorithm 1cl原创 2017-03-16 08:02:52 · 362 阅读 · 0 评论 -
Leetcode 319 - Bulb Switcher(Math)
题意点灯问题,有n个灯,进行n轮操作:第i轮,将i的所有整数倍灯的状态翻转,比如第2轮,将2,4,6…的灯的状态翻转。初始状态是所有灯都是熄灭的。求最后亮着的灯的个数。思路首先,对于每个灯i,我们只需要确定它被翻转的次数x的奇偶性即可。当x为奇数时,最后i是亮着的。当x为偶数时,最后i是熄灭的。那么我们确定x的奇偶性。我们需要明确的是,当灯i在第k轮被翻转的情况下,有i%k=0i \% k = 0,原创 2017-03-04 15:57:23 · 293 阅读 · 0 评论 -
Leetcode 365 - Water and Jug Problem(裴蜀定理)
题意jug problem,给2个罐子,容积为x和y,给定整数z,问能否用x和y凑出z的水。可做的:将任一罐子装满水。将任一罐子的水倒掉。将一个罐子的水倒到另一个罐子直到该罐子为空或者另一罐子装满。思路如果求最短步数可以通过bfs来做,这道题只需要判断能否有解。其中步骤3是水在x和y之间流通并不会造成损失,而步骤1和2可以列出如下方程:mx+ny=zmx + ny = z即我们要做的就是判断原创 2017-03-04 13:40:13 · 278 阅读 · 0 评论 -
Leetcode 231 - Power of Two
题意判断一个数n是否是2的幂次。思路算法1时间复杂度O(logn)O(logn)。直接检查n能否一直除以2直到1。算法2时间复杂度O(1)O(1)非常trick的一个思路,我们知道n如果是2的幂次,那么n的2进制表示中一定是1后面跟若干个0,即只有一个1。我们利用·n & (n - 1)的性质:将最低一位1置0,即此时n & (n - 1) = 0代码algorithm 1class Solutio原创 2017-03-02 21:03:39 · 221 阅读 · 0 评论 -
Leetcode 9 - Palindrome Number(回文数)
题意判断一个数是否是回文数,要求O(1)O(1)空间。思路如果O(1)O(1)空间的话,那么可以考虑逆转这个数字,但是会导致溢出。比如要判断123494321是否是回文串,我们只需要比较前一半和后一半,即1234和4321,所以只需要逆转数字的后一半即可。代码class Solution {public: bool isPalindrome(int x) { if (x <原创 2017-02-28 21:48:12 · 272 阅读 · 0 评论 -
Leetcode 168 - Excel Sheet Column Title(进制转化)
### 题意求一个数组在EXCEL表格下的表示,即用A-Z表示。思路即26进制下的表示。那么,就和转化进制一样。注意:A对应的数字为1,即n应该每次在-1的情况下进行转化。代码class Solution {public: string convertToTitle(int n) { string s = ""; while (n) {原创 2017-02-28 22:24:35 · 244 阅读 · 0 评论 -
Leetcode 172 - Factorial Trailing Zeroes
题意求n!n!中末尾的0的个数。思路0的出现必然是2 * 5导致的,那么只需要统计一下这些数中包含2和5的个数。因为2的个数必然远大于5,因此只需要统计5的个数。注意一些数对5的个数贡献不同,比如25=5⋅525 = 5 \cdot 5,有2个5。我们设对5的个数贡献为i个的数的个数为xix_i,x1=n/5x_1 = n / 5,并且,每出现5个贡献为1的数,就会出现一个贡献为2的数,即xi−1=原创 2017-02-28 23:27:35 · 206 阅读 · 0 评论 -
Leetcode 462 - Minimum Moves to Equal Array Elements II(中位数)
题意给一个数组,每次能够选择1个数增加1或者减小1,求最小的步数。思路即求一个数k,这个数距离所有数的距离绝对值之和最小,明显是中位数。比较粗略的证明: 假设我们取y作为我们的数k,y在中位数mid的右边。现在的距离绝对值之和为ans1。既然y在中位数的右边,我们将y左移到x,那么,y的左边的m个数:每个数的距离绝对值减小y - x。y右边的n个数:每个数距离绝对值增加y - x,由于mid为原创 2017-03-01 09:22:19 · 247 阅读 · 0 评论 -
Leetcode 400 - Nth Digit
题意找出序列中的第n位数位是什么:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11…思路先找出第n个数位所在的段:[1, 9], [10, 99], [100, 999], …这样分段找出第n个数位属于那一个段中的哪一个数字找出第n个数位属于那个数字的第k位并且返回第k位代码class Solution {public: int findNthDigit(int原创 2017-03-01 14:37:29 · 242 阅读 · 0 评论 -
Leetcode 397 - Integer Replacement(Math)
题意给一个数n,对其操作使用最少的步数将n变成1。操作:n为偶数,n / 2n为奇数,可以n + 1或者n - 1思路我们贪心的去考虑,当n比较大的时候,我们将n减小一半一定比n - 1要优。怎么尽量维持更多的减半操作呢?当n是偶数的时候,一定是n / 2。当n为奇数的时候,假设我们n=2k+1n = 2k + 1:n+1n + 1后减半:n=((2k+1)+1)/2=k+1n = ((2原创 2017-03-01 15:04:49 · 202 阅读 · 0 评论 -
Leetcode 441 - Arranging Coins(Math)
题意给出一个n,然后我们去1,2,3…的使用n。问做多能多少次(如果最后一次不够的话就不计入结果)思路算法1满足的条件是:k(k+1)2≤n\frac{k(k+1)}{2} \leq n的最大k。本来想二分一下k。然后判断。但是,从上面那个式子我们可以知道:k(k+1)≤2nk(k + 1) \leq 2n。即我们k≤2n−−√≤k+1k \leq \sqrt{2n} \leq k+1。于是我们对2原创 2017-02-11 22:24:58 · 179 阅读 · 0 评论 -
202 - Happy Number
题意判断一个数是否是Happy number。思路本来以为是道数学题,打表出来发现并没有规律,所以直接模拟就好。当结果出现1的时候为真。不然,会在一个圈内循环,所以可以用一个set记录一下是否出现过那个结果,或者用Floyd Circle Detection判环。代码algorithm 1class Solution {private: unordered_set<int> vis;pu原创 2017-03-02 19:29:05 · 173 阅读 · 0 评论 -
Leetcode 202 - Happy Number
题意判断一个数是否是Happy number。思路本来以为是道数学题,打表出来发现并没有规律,所以直接模拟就好。当结果出现1的时候为真。不然,会在一个圈内循环,所以可以用一个set记录一下是否出现过那个结果,或者用Floyd Circle Detection判环。代码algorithm 1class Solution {private: unordered_set<int> vis;pu原创 2017-03-02 19:36:34 · 211 阅读 · 0 评论 -
POJ 3737 - UmBasketella(三分)
题目链接http://poj.org/problem?id=3737题意给出一个圆锥体的表面积,求出最大体积,要求精度1e-2思路推一下公式 S=πr2+πrr2+h2−−−−−−√S = \pi r^2 + \pi r\sqrt{r^2 + h^2} 于是推出: h=S2π2r2−2Sπ−−−−−−−−√h = \sqrt{\frac{S^2}{\pi^2r^2} - \frac{2S}{\原创 2017-06-20 22:56:40 · 275 阅读 · 0 评论