数论
algsup
这个作者很懒,什么都没留下…
展开
-
[区间求交]leetcode2409:统计共同度过的日子数(easy)
思路:经典的区间求交集问题。原创 2022-09-21 19:32:12 · 412 阅读 · 0 评论 -
[BFS][贝祖定理]leetcode365:水壶问题(medium)
思路1:BFS 枚举所的状态。原创 2022-08-20 08:50:28 · 206 阅读 · 0 评论 -
[gcd]leetcode2344:使数组可以被整除的最少删除次数(hard)
所以我们先求div中所有元素的最大公约数,然后将a排序,找到一个元素能整除g,那么该元素之前的所有元素为删除的次数,即为最终答案;若没有这样的元素,则遍历完数组后,返回-1即可。若元素x能整除div中的所有元素,则x是数组div中所有元素的因子,那么x是数组div中所有元素的最大公因数gcd的因子了。...原创 2022-07-23 20:13:41 · 218 阅读 · 0 评论 -
[数学+枚举]leetcode2310:个位数字为 K 的整数之和(medium)
题目:题解:代码如下:原创 2022-07-07 19:40:40 · 222 阅读 · 0 评论 -
[直线斜率]leectcode2280:表示一个折线图的最少线段数(medium)
题目:题解:代码如下:原创 2022-06-08 07:31:21 · 106 阅读 · 0 评论 -
[圆内点的个数]leetcode2249:统计圆内格点数目(medium)
题目:题解:思路:注意到圆心坐标最大为100,半径最大也为100,那么直接枚举所有横纵坐标小于等于200的点,然后判断这个点是否在某个圆内。可以先将所有圆按半径由大到小进行排序,这样可以更早地遇到包含当前枚举的点的圆。代码如下:class Solution {public: // 思路:注意到圆心坐标最大为100,半径最大也为100,那么直接枚举所有横纵坐标小于等于200的点,然后判断这个点是否在某个圆内 // 可以先将所有圆按半径由大到小进行排序,这样可以更早地遇到包原创 2022-05-23 17:48:37 · 405 阅读 · 0 评论 -
[圆内点的个数]leetcode1828:统计一个圆中点的数目(medium)
题目:题解:思路:直接暴力枚举判断在圆内点的个数就好了。代码如下:class Solution {public: // 直接暴力枚举判断每个询问内的点的个数 vector<int> countPoints(vector<vector<int>>& points, vector<vector<int>>& queries) { vector<int> res;原创 2022-05-23 17:45:14 · 188 阅读 · 0 评论 -
[直线斜率]leetcode6076:表示一个折线图的最少线段数(medium)
题目:题解:使用149. 直线上最多的点数中的思路就好了。代码如下:using LL = long long;class Solution {public: int minimumLines(vector<vector<int>>& q) { if(q.size()==1)return 0; sort(q.begin(),q.end(),[](const auto& a,const auto& b原创 2022-05-22 16:17:18 · 157 阅读 · 0 评论 -
[三个坐标点求三角形面积]leetcode812:最大三角形面积(easy)
题目:题解:需要百度,三角形向量的面积计算公式,然后三重 for 暴力枚举三个点求最大面积值就好了。代码如下:class Solution {public: // 直接三层for暴力枚举 double largestTriangleArea(vector<vector<int>>& p) { int n=p.size(); double res=0.0; for(int i=0;i<n原创 2022-05-15 17:08:37 · 325 阅读 · 0 评论 -
[哈希表][数论]leetcode202:快乐数(easy)
题目:题解:class Solution { bool isHappy(int n) { /*解题思路1:被发现凡是不开心数,计算过程中肯定有4,这可能就是被称为不快乐的原因吧,4,死*/ while(n!=1&&n!=4) { int result=0; while...原创 2019-08-13 19:09:17 · 206 阅读 · 0 评论 -
[数论][枚举]leetcode479:最大回文数乘积(hard)
题目:题解:思路:枚举代码如下:const int mod = 1337;using LL = long long;class Solution {public: int largestPalindrome(int n) { if(n==1)return 9; int upper=pow(10,n)-1; // 从大到小地枚举回文数的左半部分 for(int left=upper;;--left){原创 2022-04-16 09:04:43 · 644 阅读 · 0 评论 -
[数论]leetcode628:三个数的最大乘积(easy)
题目:题解:分情况,找规律首先对数组进行排序,然后找到规律返回即可。1)若数组内的数字全为负数,那么最后结果肯定为负数。而最大值就是最后面两个负数相乘获得绝对值的最大值,然后再乘以一个绝对值较小的负数即可,那就是最前面那个负数。2)若数组内的数字全为正数,那么最后结果肯定为正数,而且就是最大三个正数的积。3)若数组内的数字既有负数又有正数还有0的话,那么返回前面那两种情况中的较大...原创 2020-02-01 00:00:13 · 395 阅读 · 0 评论 -
[位运算]leetcode231:2的幂(easy)
题目:题解:题解1:除2取余法,若n>1且余数不为0,那么n肯定不是2的幂次方。题解2:位运算,由于2的幂次方表示为二进制只有一位为1,其余位为0,然而负数在计算机表示为二进制的补码(即正数的原码取反+1)。比如8的二进制为00001000,-8的二进制为11111000,所以8&(-8)->00001000 & 11111000 = 00001000,即8...原创 2019-12-28 00:27:47 · 295 阅读 · 0 评论 -
[位运算][数学]leetcode342:4的幂(easy)
题目:题解:题解1:数学方法+位运算,为4的幂,那么n也为2的幂,n若为2的幂,那么n&(n-1)=0,否则不为2的幂就为1。题解2:迭代法题解3:递归法相似题型:231. 2的幂326. 3的幂代码如下:class Solution {public: //题解1:数学方法 bool isPowerOfFour_1(int n) { ...原创 2019-12-28 00:55:52 · 182 阅读 · 0 评论 -
[进制转换]leetcode168:Excel表列名称(easy)
题目:168. Excel表列名称题解:将n转换为26进制数,与10进制转换为2进制一样的,都是除26取余数,注意最后的字符串需要反转,因为余数每次都是添加在最后面的,所以需要反转。代码如下:class Solution {public: //题解:进制转换,将n转换为26进制,也就是与10进制转换为2进制一样,除26取余 string convertToTit...原创 2019-12-13 21:37:44 · 151 阅读 · 0 评论 -
[字符串][竖式相乘]leetcode43:字符串相乘(medium)
题目:题解:竖式算法,规律如下:1)乘数num1位数为M,被乘数num2位数为N, num1 x num2 结果 res 最大总位数为 M+N2)num1[i] x num2[j]的结果为 tmp(位数为两位,"0x","xy"的形式),其第一位位于 res[i+j],第二位位于 res[i+j+1]。代码如下:class Solution {public: st...原创 2019-12-04 14:49:35 · 219 阅读 · 0 评论 -
[字符串][数学]leetcode8:字符串转换整数 (atoi) (medium)
题目:8. 字符串转换整数 (atoi)题解:题解1:利用istringstream将str的第一个单词读取到res中:若第一个单词为string则读取不成功,res为0;若超过int范围,res为最大值或最小值;其他情况,读取成功。题解2:常规解法,看代码就好了,因为没有遇到具体的算法点。代码如下:class Solution {public: //解法1:利...原创 2019-11-25 15:31:45 · 195 阅读 · 0 评论 -
[数学][双指针]leetcode9:回文数(easy)
题目:题解:题解1:双指针将数字转换为字符串,然后利用首尾指针向字符串中间走,若首尾指针所指的字符不想等,则返回false,否则最后left==rigth,那么就是回文数了。题解2:数学首先排除负数,因为负数一看就不是回文数。然后将数字x的尾数字依次添加到cur后面,最后判断x是否等于cur,具体看代码。代码如下:class Solution {public: /...原创 2019-11-24 17:31:33 · 315 阅读 · 0 评论 -
[除法转换为减法]leetcode29:两数相除(medium)
题目:题解:题解1:作弊法,排除溢出情况后,直接返回两数相除的结果题解2:减法,计算被除数能减去除数的个数比如[15,3],若被除数15每次减除数3,需要减5次。那么请思考如何简化呢?答案:将除数每次都翻倍,直到除数大于被除数时,将除数还原为初始值。比如第一次[15,3](这里减了一个除数,result+=1),第二次就变为[12,6](这里减了两个除数,result+=2...原创 2019-11-23 16:22:41 · 1831 阅读 · 0 评论 -
[二分法][等差公式]leetcode367:有效地完全平方数(easy)
题解:题解:class Solution {public: //解法1:库函数 bool isPerfectSquare_1(int num) { int x=sqrt(num); return x*x==num; } //解法2:公式法,1+3+5+7+9+…+(2n-1)=n^2 bool isPerfe...原创 2019-08-28 18:21:29 · 195 阅读 · 0 评论 -
[格雷编码][镜像反射]leetcode1238:循环码排列(medium)
题目:1238.循环码排列题解:本题与89.格雷编码的区别在于第一个数字指定为start,后面的每个数字都要和前一个数字只能有一位不同,那用什么来产生只有一位不同的数字呢?答案是异或^,对每一个数字倒序去异或值就行了。长度为1时,对第一位和1异或,使得第一位产生不同。长度为2时,对第二位和1异或,使得第二位产生不同,以此类推。所以本题与89.格雷编码的唯一区别就是加号+改成异或^...原创 2019-11-18 22:48:47 · 269 阅读 · 0 评论 -
[回溯][康托展开法]leetcode60:第k个排列(medium)
题目:题解:题解1:回溯法本题自然而然地想到用回溯法解决,然而k值过大时,导致超时了,所以使用解法2的数学方法。题解2:康托展开康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。对于n=3,k=3,我们将k减1(k--)表示k之前有k-1个排列,然后用2 / (3-1)! =1 余...原创 2019-11-11 22:09:20 · 227 阅读 · 0 评论 -
[数学]leetcode1033:移动石子直到连续(easy)
题目:题解:(原谅我本人语文水平有限,这题读懂花了很长时间(哭唧唧)本题的大意:将a、b、c中a和c移动到与b相差一位的最小次数和最大次数,也就是是a、b、c这三个数相差为1的最小次数和最大次数。每次只能移动最左侧,或者最右侧的石子往中间移动。所以z-x的值是逐渐收敛的最大步数:最大次数就是一步一步往中间挪,所需的步数是z-x-2。因为c和a之间能移动的空间是z-x-1,还要去掉一个...原创 2019-10-24 15:28:10 · 339 阅读 · 0 评论 -
[数论]leetcode13:罗马数字转整数(easy)
题目:13. 罗马数字转整数题解:本题考查是纯数学问题(想清楚其实很简单啊),算法思想如下:用hashmap来映射符号和值,然后从左到右遍历字符串,若当前字符表示的数字小于它右边字符表示的数字,那么我们减去这个字符表示的数字;若当前字符表示的数字大于等于它右边字符表示的数字,那么我们加上这个字符表示的数字。代码如下:class Solution {public: ...原创 2019-10-22 00:04:29 · 163 阅读 · 0 评论 -
[数论]leetcode326:3的幂(easy)
题目:题解:解法1:暴力法若n是3的幂,那么我们每次除以3都能整除,最终得到数字1,表示整除结束。若n不是3的幂,那么在某次n除以3时不能整除,也就是最终得到的数字不为1。所以我们循环的条件的条件是n%3==0,在余数不为0,我们需要判断缩小后的n是否为1,就可判断输入n是否为3的幂了。解法2:数论3的幂次质因子只有3,而整数范围内的3的幂次最大是1162261467代...原创 2019-10-03 20:32:40 · 342 阅读 · 0 评论 -
[位运算][数列求和]leetcode268:缺失数字(easy)
题目:题解:题目大意:数组中的元素为区间[0,n]中的n个元素,不存在重复元素,所以数组中的元素缺失[0,n]中的一个数字。解法1:先将数组进行排序,然后排除边界情况(首元素不为0或尾元素不为数组的大小)后,然后遍历数组判断相邻项是否相差为1即可。解法2:异或。由题意可知,数组的大小为n,数组中的元素为范围[0,n]中的n个数字(缺少一个数字),所以我们直接将原数组与[0,n]范围...原创 2019-10-03 18:16:31 · 223 阅读 · 0 评论 -
[埃拉托色尼筛选法][线性筛]leetcode204:计数质数(easy)
题目:题解:质数:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。本题采用埃拉托色尼筛选法(The Sieve of Eratosthenes),该算法步骤如下:代码如下:class Solution {public: //质数:大于1的且除1和本身以外不再有其他因数的自然数,所以计算质数要除去1和它本身n,遍历的范围为[2,n-1] int c...原创 2019-10-03 16:39:30 · 272 阅读 · 1 评论 -
[阶乘]leetcode172:阶乘后的零(medium)
题目:题解:1)本题是求阶乘后的0,而0通过5 * 2=10求得,然而我们不必管2的个数,因为偶数就会产生2,所以我们只需要计算5的个数就好了。2)不过需要注意类似31!中的25=5 * 5有两个5,所以我们不仅需要统计当前小于n的数中有多少个5,还需要统计n的商中是否存在5。代码如下:class Solution {public: int trailingZero...原创 2019-10-02 21:02:36 · 131 阅读 · 0 评论 -
[直线斜率]leetcode149:直线上最多的点数(hard)
题目:题解:1)本题是求直线上最多的点数,我们可遍历数组中的每一个点,然后寻找和遍历到的点可组成斜率一样直线的点就好了。注意:我们也需要统计坐标点重复的点。2)关于斜率k=Δy/Δx的计算,与其使用除法得到不太准确的商,倒不如变换斜率公式将除法转换为乘法,Δy1/Δx1=Δy2/Δx2 => Δx1*Δy2=Δy1*Δx2,注意使用乘法会导致积溢出,所以我们要使用long lon...原创 2019-10-01 20:55:27 · 460 阅读 · 0 评论 -
[分数转换为小数]leetcode166:分数到小数(medium)
题目:题解:本题倒是不是很难,只是卡边界很恶心:1)边界条件分子为0或分母为0的情况,需要先排除。2)需要将分子分母转换为long long,不然就会产生溢出,出现这个恶心数-2147483648了。3)需要判断结果的正负号问题,再取了符号后,将分子分母全部转换为正数即可。4)需要判断余数是否为0,若余数为0,就直接将商添加到result后面返回即可;若余数不为0,需要添加再商的...原创 2019-10-01 23:28:01 · 389 阅读 · 0 评论