leetcode中的数学问题

本文解析了LeetCode上的三道经典算法题目:2KeysKeyboard、PowerofThree及PowerofFour,详细介绍了每道题目的题意、解题思路及代码实现。

分列如下:

  • 650.2 Keys Keyboard
  • 326.Power of Three
  • 342.Power of Four

650. 2 Keys Keyboard

https://leetcode.com/problems/2-keys-keyboard/description/

题意

Initially on a notepad only one character ‘A’ is present. You can perform two operations on this notepad for each step:

Copy All: You can copy all the characters present on the notepad (partial copy is not allowed).
Paste: You can paste the characters which are copied last time.
Given a number n. You have to get exactly n ‘A’ on the notepad by performing the minimum number of steps permitted. Output the minimum number of steps to get n ‘A’.

Example 1:
Input: 3
Output: 3
Explanation:
Intitally, we have one character ‘A’.
In step 1, we use Copy All operation.
In step 2, we use Paste operation to get ‘AA’.
In step 3, we use Paste operation to get ‘AAA’.
Note:
The n will be in the range [1, 1000].

解析

参考了原题目的solution。
对于我们的所有操作,我们可以抽象成(copy, paste, ...,paste)序列。例如,CPPCPPPPCP 就可以看作 [CPP][CPPPP][CP]
假设上面的这些抽象序列的长度为g_1, g_2, ...,如[CPP][CPPPP][CP]的长度为3,5,2.经过第一个操作分组处理后,输出结果为,g_1个'A',经过第二个操作分组后为g_1*g_2个'A',经过第N个操作分组处理后,为g_1*g_2*...*g_3个'A'
我们恰好需要N个‘A’,N=g_1-g_2*...*g_n。如果任一个g_i是可分解的,例如g_i= p * q,即把操作序列分为了两个,前一个有p-1个P,后一个有q-1个P
可以证明,这样的分解不会导致更多的操作。分解之前,我们需要pq个操作,分解之后我们需要p+q个操作。令p+q <= pq,即(p-1)(q-1) >= 1,只要p>=2q>=2即为真。
因此,这个问题可以归结为,寻找N的最大质数分解。

代码

class Solution {
public:
    int minSteps(int n) {
        int ans = 0, d = 2;
        while(n >1) {
            while(n % d == 0){
                ans += d;
                n/=d;
            }
            d++;
        }
        return ans;
    }
};

326. Power of Three

来源 https://leetcode.com/problems/power-of-three/description/

题意

判断给出的正数是否3的次方。
尽量不使用循环和递归

优美思路

  • 之一:判断对3取对数是否为整数。关键点在于3,是素数。所以如果对3取对数是整数,那么一定是3的次方。
class Solution {
public:
    bool isPowerOfThree(int n) {
        return fmod(log10(n)/log10(3), 1)==0;
    }
};
  • 之二:判断是否是1162261467的因子。1162261467是INT范围内,3的最大次方,3的19次方。加上3是素数,所以如果能被1162261467整除,原数一定是3的次方。

    class Solution {
    public:
        bool isPowerOfThree(int n) {
            return n > 0 && 1162261467 % n == 0;
        }
    };

342. Power of Four

https://leetcode.com/problems/power-of-four/description/

题意

判断给出的正数是否4的次方。
尽量不使用循环和递归

优美思路

主要是判断4的次方的2进制位特征。
优雅至极,参考以下链接http://bookshadow.com/weblog/2016/04/18/leetcode-power-of-four/

### LeetCode 数学类型题目解题顺序推荐 #### 一、基础数学概念理解 对于初学者来说,掌握基本的数学原理至关重要。这不仅有助于解决特定类型的LeetCode问题,还能增强整体编程逻辑能力。 - **位运算操作** - 学习如何利用二进制表示来简化某些计算过程,比如快速判断奇偶性或是实现高效的加减乘除替代方案。 - **取模运算特性** - 掌握求余数的方法及其应用场景,在处理循环模式识别等问题时非常有用[^4]。 ```cpp // 示例:找出只出现一次的数字(其他都出现了三次) int singleNumber(std::vector<int>& nums) { int value = 0; for (int i = 0; i < 32; ++i) { int sum = 0; for (size_t j = 0; j < nums.size(); ++j) { if ((nums[j] >> i) & 1) { sum += 1; } } value += ((sum % 3) << i); } return value; } ``` #### 二、逐步深入的数据结构与算法融合 随着技能提升,应该尝试将所学到的基础知识应用于更加复杂的场景之中。 - **组合运用多种技术手段解决问题** - 当面对涉及较大数值范围或者精度要求较高的挑战时,可能需要结合大整数库、分数类等高级工具;同时也要善于挖掘题目背后隐藏着的经典算法模型,如欧几里得最大公约数算法等。 #### 三、针对具体领域优化解决方案 最后阶段则是专注于某一方向上的精深研究与发展。 - **几何图形分析** - 如果对平面直角坐标系下的距离度量感兴趣,则可以从最简单的两点间直线距离开始探索,逐渐过渡到多边形面积周长测量等方面。 - **概率统计推断** - 关注随机事件发生的可能性评估以及期望值预测等内容,这类知识点往往能够帮助我们更好地理解和设计蒙特卡洛模拟等相关程序[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值