ath
文章平均质量分 85
分享算法经验
枫yy
靡不有初,鲜克有终。
展开
-
算法 —— 位运算
好好思考一下,一个偶数变成一个奇数需要加一或者减一,在二进制上最直观的表现是最低位是否为1,如果为1那么就是奇数,如果为0那么就是偶数,这样就能够解释if语句里的内容了。在文章最开始提到,异或运算是无进制相加,意味着它只能识别不要进位的那些二进制位,这时候我们把进位和异或运算结合在一起就可以实现不用加减运算符达到两整数之和的目的。这里我们使用一个int类型的变量来存值,可以存32个比特位,二进制位为0表示没出现,1为出现。2、给一个数n,确定它的二进制表示中的第 x 位是0还是1。原创 2024-08-05 10:22:57 · 1488 阅读 · 1 评论 -
算法 —— 递推
同上出栈数始终比入栈大1才为非法,很显然这是一个卡特兰数问题,注意卡特兰数后面数据过大,long long存不下,很显然还需要结合高精度模拟。此题很像斐波那契数列的解决方式,斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……,那么我们可以看到,如果要移动到B点,总路程为2n,左图绿色路径为刚好越过约束条件的情况,我们可以看到,绿色非法路径的突出点与橙色路径都不约而同的经过右图蓝色直线,意味着路径。如果一个点从坐标A(0,0)开始移动到坐标B(n,n),原创 2024-08-01 22:25:34 · 1809 阅读 · 0 评论 -
算法 —— 暴力枚举
第二看纵向宽发生改变,长重置为1,长为1,宽为2的时候,第一行个数为7个,总共有5 x 7 个,长为2,宽为2的时候 第一行个数为6个,共有5 x 6个……首先是横着的长方形,宽始终为1,长不断发生改变,可以看出长为2的时候,第一行个数为6个,总共有6 x 6个,长为3的时候,总共有6 x 5个……这是一道简单的模拟题,枚举出所有可能情况,不会超过规定时间的,以下附上k原创 2024-07-25 23:26:35 · 5047 阅读 · 10 评论 -
算法 —— 快速幂
下几层的总目标是让,不是奇数,只把 81 ^ 2 当作 (81 ^ 2) ^ 1。这时候已经不用看成什么分解了,𝑎𝑛𝑠∗=6561 就可完成总目标,b/2 为 0,结束循环。现在 𝑏𝑎𝑠𝑒=𝑎,表示的是,𝑎 ^ 1 = 𝑎,待会 𝑏𝑎𝑠𝑒会发生改变的。,依旧𝑎𝑛𝑠 ∗= 𝑏𝑎𝑠𝑒(base此时为a的四次方)b右移一位后变成0,循环结束。原创 2024-07-15 22:14:42 · 2166 阅读 · 0 评论 -
算法 —— 高精度(模拟)
通过减法可以利用该函数实现加法中的正数加负数,当然在面对小减大的情况时,需要通过一个比较函数来判断两数的绝对值大小处理完之和直接在最终结果的字符串前头插一个” - "加减法所有可能情况式子形式大小比较结果大小正数a + 正数b两者都大于0大于0正数a + 负数b大于等于0正数a + 负数b小于0负数a + 负数b两者都小于0小于0正数a - 正数b大于等于0正数a - 负数b大于0负数a - 正数b小于0负数a - 负数b小于0负数a - 负数b大于0。原创 2024-07-13 19:51:29 · 1691 阅读 · 1 评论 -
算法 —— 模拟
各位读者有听说过“建模”一词吗?所谓“建模”,就是把事物进行抽象,根据实际问题来建立对应的数学模型。“抽象”并不意味着晦涩难懂;相反,它提供了大量的便利。计算机很难直接去解决实际问题,但是如果把实际问题建模成数学问题,就会大大地方便计算机来“理解”和“解决”。举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好。当然不能把成绩单对着电脑晃一晃,然后问“谁考得最好?需要通过一种途径让计算机来理解这个问题。这个问题可以建模成:“给定数组score[],问数组内元素的最大值”。原创 2024-07-11 15:44:32 · 559 阅读 · 0 评论 -
算法 —— 前缀和
需要前n项和直接访问dp前缀和数组的下标位置即可。,这样时间复杂度太高,这时候我们构造一个前缀和数组,将。1 - n区间内各区间的和存入进去。预处理一个前缀和矩阵,将。存在这个dp数组中,通过。如果我们用暴力解法,原创 2024-07-08 09:55:24 · 607 阅读 · 0 评论 -
算法 —— 二分查找
这道题可以引出另外两个重要的二分查找模板:查找左边界的二分模板 查找右边界的二分模板以上是两个模板的内容,判断条件根据题目内容修改,以题目示例1为例,下面给出具体解释为什么这样做可行:public:// 处理为空// 找左端点else// 判断是否有结果// 找右端点 // left可以从左端点开始elseleft = mid;= -1)else。原创 2024-07-07 08:53:13 · 763 阅读 · 0 评论 -
算法 —— 滑动窗口
如果题目正向思考困难,可以从另外一方面思考,例如本题要找最短长度,且元素可能在左右端口出现,另外最短长度数组元素之和刚好为x,这个代码实现起来过于麻烦,可以想找一个最长长度的子数组,使他元素之和刚好为sum - x,这样又转化为滑动窗口问题。,所以相加会使sum变大,相减会使sum变小,至于为什么可以这样做,这其实是在暴力枚举的基础上进行了优化,例如2,3,1,2相加等于8已经超过target,这样就不需要继续加后面的4,3,因为此时已经满足条件,我们要做的是。,意味着我们要开一个128大小的数组。原创 2024-07-01 22:53:00 · 1428 阅读 · 0 评论 -
算法 —— 双指针
首先固定最大的数,以一个循环为例,先固定最大数10,左指针指向下标为0的元素(2),右指针指向下标为5的元素(9),a就是2,b就是9,c就是10,a + b > c,那么a——b这个区间里所有数加b都大于c,那么把810看作巢穴,把一次平方和规则看作鸽,经过811次平方和后,会导致810个巢穴不够分,至少有一个巢穴是两个鸽:意味着经过810次以上的平方和规则后,势必出现重复,重复后就进环。right--找到次小的数5,再使left从下标0开始,a + b小于c,那么让left++,使得left变大,原创 2024-06-29 21:22:47 · 1180 阅读 · 0 评论