leetcode中的数学问题

分列如下:

  • 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)