ソードフィンガーオファー14-I。Cut the Rope(C ++)欲張りアルゴリズム

これが長さnのロープです。ロープを整数の長さのm個のセグメントに切断してください(mとnは整数、n> 1とm> 1)。各ロープの長さはk [0]、k [1です。 ] ... k [m-1]。k [0] k [1] …* k [m-1]の可能な最大の積は何ですか?たとえば、ロープの長さが8の場合、2、3、3の長さで3つに切断します。この時点で得られる最大の積は18です。

例1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

例2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

促す:

2 <= n <= 58
注:この質問は、メインのWebサイトの質問343と同じです:https://leetcode-cn.com/problems/integer-break/

問題解決のアイデア:

数学的導出:推論:複数のセグメントに等しい長さのロープ得られた最大の積。
当然の結果2:ロープを可能な限り長さ3の複数のセクションに分割すると、製品が最大になります。

アルゴリズムフロー:

ここに画像の説明を挿入します
ここに画像の説明を挿入します

複雑さの分析:

時間計算量O(1):整数、剰余、および累乗演算のみ。
整数および剰余演算:データには、マシンの数を超えない整数はO(1)Oと見なすことができると記載されています。
べき乗演算:情報を参照し、浮動小数点のべき乗はO(1)であると記載されています。
スペースの複雑さO(1):変数aとbは、一定サイズの余分なスペースを使用します。

著者:jyd
リンク:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang -by /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

パターンを見つける
ここに画像の説明を挿入します

class Solution {
    
    
public:
    int cuttingRope(int n) {
    
    
        if (n < 4)return n - 1;
        int a = n / 3, b = n % 3;
        if (b == 0)return a = pow(3, a);//pow(3, a)表示3的a次方
        if (b == 1)return a = pow(3, a-1) * 4;
        if (b == 2)return a = pow(3, a) * 2;
        return a;
    }
};

著者:z1m
リンク:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/xiang-jie-bao-li-di-gui-ji-yi-hua-ji-zhu-dong -tai- /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114733448