首页 > 其他分享 >【代码随想录】刷题记录(103)-整数拆分

【代码随想录】刷题记录(103)-整数拆分

时间:2025-01-17 17:57:08浏览次数:3  
标签:return 乘积 示例 int 最大值 随想录 103 dp 刷题

题目描述:

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

 

示例 1:

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

示例 2:

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

 

提示:

  • 2 <= n <= 58

 

我的作答:

思路就是递归,取两个数的最大值和一个数乘以另一个数拆分后的最大值的最大值;我觉得递归好难啊啊啊啊啊;

class Solution(object):
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n==0 or n==1: return 0
        if n==2: return 1
        dp = [0]*(n+1) #dp是每一个数能分裂得到的乘积最大值
        dp[2] = 1
        for i in range(3, n+1):
            for j in range(1, i//2+1): #超过i//2时就是一样的(对称)
                dp[i] = max(dp[i], (i-j)*j, dp[i-j]*j) 
        return dp[n]

4d8354afc775451f9a654ba201517930.png

 

参考:

class Solution(object):
    def integerBreak(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 3:
            return 1 * (n - 1)  # 对于n小于等于3的情况,返回1 * (n - 1)

        dp = [0] * (n + 1)  # 创建一个大小为n+1的数组来存储最大乘积结果
        dp[1] = 1  # 当n等于1时,最大乘积为1
        dp[2] = 2  # 当n等于2时,最大乘积为2
        dp[3] = 3  # 当n等于3时,最大乘积为3

        # 从4开始计算,直到n
        for i in range(4, n + 1):
            # 遍历所有可能的切割点
            for j in range(1, i // 2 + 1):
                # 计算切割点j和剩余部分(i - j)的乘积,并与之前的结果进行比较取较大值
                dp[i] = max(dp[i], dp[i - j] * dp[j])

        return dp[n]  # 返回整数拆分的最大乘积结果

068b885dc188482798ad199a7be9b2aa.png

 

标签:return,乘积,示例,int,最大值,随想录,103,dp,刷题
From: https://blog.csdn.net/Aerochacha/article/details/145160416

相关文章

  • 【hot100】刷题记录(1)-移动零
    题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0] 提示:1<=nu......
  • 代码随想录 字符串 test 3
    54.替换数字(第八期模拟笔试)        为了不使用额外的空间,采用双指针,通过用旧指针遍历原数组计算出数字个数,进而计算出新数组应有的大小,然后新指针指向新数组的最后,此时新,旧指针都位于两数组的末尾,同时从后往前遍历,遇到数组,新指针就需要写入number,遇到字母,就赋值旧数......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • 代码随想录算法训练营第8天 | 344.反转字符串,541. 反转字符串II,替换数字
    一、刷题部分1.1题目名称原文链接:代码随想录题目链接:344.反转字符串-力扣(LeetCode)1.1.1题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节
    9-24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提......
  • 代码随想录:二叉搜索树的最小绝对值
    遍历二叉搜索树,定义一个全局的上一个节点确实好用/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):......
  • 代码随想录:验证二叉搜索树
    二叉搜索树的中序遍历结果是一个递增的数组为了省空间可以用一个变量记录上一次的数字我一开始设置上一次的为null,结果c++中int为null时实际为0,所以要用最小值/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • C语言二级刷题---程序设计01
     请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):程序运行后,如果输入精度0.0005,则程序输出为3.140578。#include<stdio.h>#include<math.h>doublefun(doubleeps){}main(){doublex;voidNONO();......
  • STM32F103使用flash_algo解析FLM相关
    1、全局区(.bss段和.data段)根据实际情况修改2、栈顶地址根据实际情况修改/*FlashOSRoutines(AutomagicallyGenerated)*Copyright(c)2009-2015ARMLimited*/#include"flash_blob.h"//代码区flash_code[]使用JLINK/STLINK等放到RAM,一般是0x20000000staticconst......
  • 构造刷题记录
    [AGC001D]ArraysandPalindrome首先观察发现奇数的个数看起来很重要,然后手玩一会发现最多只能有两个奇数,然后再分讨构造就可以了。[AT_hitachi2020_c]ThREE观察到\(3\mida\timesb\)要求\(a,b\)中至少一个3的倍数。发现如果两个点的距离为3的话他们的深度的奇......