可视化图解算法78:整数拆分

1.题目

描述

给定一个正整数 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

2. 题解思路

本题如果不是强调用动态规划,很难想到用动态规划来解决。对于一个整数的拆分,也有技巧:对于一个数,可以拆分为2个数的乘机,也可以拆分成多个数的乘机。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3.编码实现

核心代码如下:

Go 复制代码
func integerBreak(n int) int {
	//1.定义状态.	i:给定的正整数;	dp[i]:对i进行拆分,最大的乘机
	dp := make([]int, n+1)
	//2.初始化边界条件:
	dp[0] = 0 //0只能拆分为:0与0,相乘结果为0
	dp[1] = 0 //1只能拆分为:1与0,相乘结果为0
	dp[2] = 1 //2可以拆分为:1与1,最大相乘结果为1
	//3.确定递推公式:
	for i := 3; i <= n; i++ {
		for j := 1; j < i; j++ {
			//for j := 1; j <= i/2; j++ {
			dp[i] = max(j*(i-j), j*(dp[i-j]), dp[i]) //对于每一个i,有多次的拆分,因此需要对每次的dp[i]取最大值
			fmt.Printf("%d\t", dp[i])
		}
	}
	fmt.Println("\n", dp)
	// 4.输出结果
	return dp[n]
}
func max(a, b, c int) int {
	var maxValue int
	if b <= a && c <= a {
		maxValue = a
	} else if a <= b && c <= b {
		maxValue = b
	} else {
		maxValue = c
	}
	return maxValue
}

具体完整代码你可以参考下面视频的详细讲解。

4.总结

本题想对来说还是比较难,难点是想到用动态规划解决,并且对一个整数拆分的情况进行细分。对i进行拆分包括2种情况:

  • 拆分为2个数:j x(i-j);

  • 拆分为3个数或者更多,即固定j,对 i-j 进一步拆分:j x dpi-j;其中,j为变量,取值为:1:i-1

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅ 链表

  ✅ 二叉树

  ✅ 二分查找、排序

  ✅ 堆、栈、队列

  ✅ 回溯算法

  ✅ 哈希算法

  ✅ 动态规划

无论你是备战笔试面试 、提升代码效率 ,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:三更灯火五更鸡,正是男儿读书时。

相关推荐
小雨下雨的雨11 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.13 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*13 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
綝~14 小时前
爬虫数据采集工程师岗位面试题
爬虫·面试·请求
cfm_291415 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
如竟没有火炬15 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi816 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术16 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅100517 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode