子数组的最大乘积

钙钛矿太阳能电池稳定性测试:ISOS协议详解与标准化实践指南 在光伏器件研发中,稳定性测试是评估材料与器件长期可靠性的核心环节,其关键在于实现测试条件的标准化与数据的可比性。通过控制变量和模拟真实环境应力,标准化测试协议能够系统揭示材料衰减机理与器件失效模式,为技术迭代提供可靠依据。在钙钛矿太阳能电池领域,ISOS协议作为国际公认的测试框架,通过分级体系(如ISOS-L系列光照测试与ISOS-D系列暗态测试)和关键参数定义(如光源光谱匹配、MPP跟踪、结温控制),解决了不同实验室数据无法横向对比的痛点。该协议不仅规范了测试流程,还通过硬件系统搭建、自动化数据采集与归一 阅读详情

《编程之美》 2.13

问题:给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。

解法一:把所有N-1个数的组合找出来,分别计算乘积,比较大小。O(N^2)。

int MaxSubProducti(int a[],int n)
{
	assert(n > 1);
	int i,j,k,prod,ret;
	for (i = 0; i < n; i++){
		prod = 1;
		for(j = 0; j < i; j++){
			prod *= a[j];
		}
		for(j = i + 1; j < n; j++){
			prod *= a[j];
		}
		if (i == 0) ret = prod;
		if (prod > ret) ret = prod;
	}
	return ret;
}

int MaxSubProductii(int a[],int n)
{
	assert(n > 1);
	int i,j,prod,ret;
	for(i = 0; i < n; i++){
		prod = 1;
		for(j = 0; j < n; j++){
			prod *= (i == j) ? 1 : a[j];
			if (prod == 0)// terminate early
				break;
		}
		if (i == 0) ret = prod;
		if (prod > ret)	ret = prod;
	}
	return ret;	
}

解法二:利用两个数组s和s分别表示从数组a的两端开始计算的乘积,s[i] = a[0]*a[1]*...*a[i-1],t[j] = a[j]*...*a[n-1]。那么p[i] = s[i-1] * t[i+1]。时间复杂度为O(N)。

int MaxSubProductiii(int a[],int n)
{
	assert(n > 1);
	int *s = (int *)malloc(n*sizeof(int));
	int *t = (int *)malloc(n*sizeof(int));
	int i,j,lowprod,highprod,maxprod,prod;
	lowprod = 1;
	highprod = 1;
	assert(s != NULL && t != NULL);
	
	for(i = 0; i < n; i++){
		j = n - i - 1;
		lowprod *= a[i];
		highprod *= a[j];
		s[i] = lowprod;
		t[j] = highprod;
	}
	maxprod = (s[n-2] > t[1]) ? s[n-2] : t[1];
	for(i = 1; i < n - 1; i ++){
		prod = s[i-1] * t[i+1];
		if (prod > maxprod) maxprod = prod;
	}
	free(s);
	free(t); 
	return maxprod;
}

解法三:统计数组中正数、负数和零的个数,记录最小的正数、负数以及最大的负数。

1,如果零的个数n_zero大于1,那么最大乘积为0;

2,如果零的个数n_zero为1:

(1),如果负数的个数n_neg为奇数,那么最大乘积为0;

(2),如果负数的个数n_neg为偶数,那么最大乘积计算式扣除a[zeroi];

3,如果零的个数n_zero为0:

(1),如果负数的个数n_neg为奇数,那么最大乘积计算式扣除a[maxnegi];

(2),如果负数的个数n_neg为偶数:

1> 如果正数的个数n_pos为零,那么最大乘积计算式扣除a[minnegi];

2> 如果正数的个数n_pos大于零,那么最大乘积计算式扣除a[minposi];

int MaxSubProductiv(int *a, int n)
{
	int n_zero = 0; // count of zero 
	int n_neg = 0;  // count of negative integer
	int n_pos = 0;
	int maxneg = 0; // maximum negative integer 
	int minpos = 0; // minimum positive integer 
	int maxnegi = 0; // index of maxneg
	int minposi = 0; // index of minimum positive integer
	int zeroi = 0;   // index of zero
	int minneg = 0;
	int minnegi = 0;
	int out = -1;    // index of the val to be omitted 
	                 // when calculating result product
	int max = 1;
	
	/* collect some statistic info in one loop */
	for(int i = 0; i < n; i++)
	{
		if(a[i] < 0)  //a[i] is negative
		{
			n_neg++;
			if(maxneg == 0)
			{
				maxneg = a[i];
				maxnegi = i;
			}
			else if(maxneg < a[i])
			{
				maxneg = a[i];
				maxnegi = i;
			}
			
			if (minneg == 0) {
				minneg = a[i];
				minnegi = i;
			}
			else if (minneg > a[i]) {
				minneg = a[i];
				minnegi = i;
			}
		}
		else if(a[i] == 0) // a[i] is zero
		{
			zeroi = i;
			if(++n_zero > 1) return 0;
		}
		else // a[i] is positive
		{
			n_pos++;
			if(minpos == 0)
			{
				minpos = a[i];
				minposi = i;
			}
			else if(minpos > a[i])
			{
				minpos = a[i];
				minposi = i;
			}
		}
	}
 
 
	if((n_zero == 1) && (n_neg & 0x1))
	{
		// one zero and odd negatives
		return 0;
	}
	else if((n_zero == 1) && !(n_neg & 0x1))
	{
		// one zero and even negatives
		printf("one zero and even negatives\n");
		out = zeroi;
	}
	else if((n_zero == 0) && (n_neg & 0x1))
	{
		// no zero and odd negatives
		printf("no zero and odd negatives\n");
		out = maxnegi;
	}
	else if((n_zero == 0) && !(n_neg & 0x1))
	{
		// no zero and even negatives
		printf("no zero and even negatives\n");
		if (n_pos == 0){
			out = minnegi;
		}
		else {
			out = minposi;
		}
	}
	
	for(int i = 0; i < n; i++)
	{
		max *= (i == out) ? 1 : a[i];
	}
	return max;
}

int MaxSubProductv(int *a, int n)
{
	int n_zero = 0; // count of zero 
	int n_neg = 0;  // count of negative integer
	int n_pos = 0;  // count of positive integer
	int maxneg = 0; // maximum negative integer 
	int minpos = 0; // minimum positive integer 
	int maxnegi = 0; // index of maxneg
	int minposi = 0; // index of minimum positive integer
	int zeroi = 0;   // index of zero
	
	int minneg = 0;
	int minnegi = 0;
	
	int out = -1;         // index of the val to be omitted 
	                 // when calculating  product
	int max = 1;
	
	for(int i = 0; i < n; i++)
	{
		if(a[i] < 0)  //a[i] is negative
		{
			n_neg++;
			if(maxneg == 0)
			{
				maxneg = a[i];
				maxnegi = i;
			}
			else if(maxneg < a[i])
			{
				maxneg = a[i];
				maxnegi = i;
			}
			
			if (minneg == 0){
				minneg = a[i];
				minnegi = i; 
			}
			else {
				if (minneg > a[i]){
					minneg = a[i];
					minnegi = i;
				}
			} 
		}
		else if(a[i] == 0) // a[i] is zero
		{
			zeroi = i;
			if(++n_zero > 1) return 0;
		}
		else // a[i] is positive
		{
			n_pos++;
			if(minpos == 0)
			{
				minpos = a[i];
				minposi = i;
			}
			else if(minpos > a[i])
			{
				minpos = a[i];
				minposi = i;
			}
		}
	}
 
 	if (n_zero){
 		printf("zeros.\n");
 		if (n_neg & 1)
 			return 0;
 		else
 			out = zeroi;
 	}
 	else {
 		printf("no zero.\n");
 		if (n_neg & 1)
 			out = maxnegi;
 		else if (n_pos == 0){
 			out = minnegi;
 		}
 		else {
 			out = minposi;
 		}
 	}
		
	for(int i = 0; i < n; i++)
	{
		max *= (i == out) ? 1 : a[i];
	}
	return max;
}

测试程序:

#include <stdio.h>
#include <assert.h>
#include <time.h>
#include <stdlib.h>


int MaxSubProducti(int a[],int n)
{
	assert(n > 1);
	int i,j,k,prod,ret;
	for (i = 0; i < n; i++){
		prod = 1;
		for(j = 0; j < i; j++){
			prod *= a[j];
		}
		for(j = i + 1; j < n; j++){
			prod *= a[j];
		}
		if (i == 0) ret = prod;
		if (prod > ret) ret = prod;
	}
	return ret;
}

int MaxSubProductii(int a[],int n)
{
	assert(n > 1);
	int i,j,prod,ret;
	for(i = 0; i < n; i++){
		prod = 1;
		for(j = 0; j < n; j++){
			prod *= (i == j) ? 1 : a[j];
			if (prod == 0)// terminate early
				break;
		}
		if (i == 0) ret = prod;
		if (prod > ret)	ret = prod;
	}
	return ret;	
}

int MaxSubProductiii(int a[],int n)
{
	assert(n > 1);
	int *s = (int *)malloc(n*sizeof(int));
	int *t = (int *)malloc(n*sizeof(int));
	int i,j,lowprod,highprod,maxprod,prod;
	lowprod = 1;
	highprod = 1;
	assert(s != NULL && t != NULL);
	
	for(i = 0; i < n; i++){
		j = n - i - 1;
		lowprod *= a[i];
		highprod *= a[j];
		s[i] = lowprod;
		t[j] = highprod;
	}
	maxprod = (s[n-2] > t[1]) ? s[n-2] : t[1];
	for(i = 1; i < n - 1; i ++){
		prod = s[i-1] * t[i+1];
		if (prod > maxprod) maxprod = prod;
	}
	free(s);
	free(t); 
	return maxprod;
}

int MaxSubProductiv(int *a, int n)
{
	int n_zero = 0; // count of zero 
	int n_neg = 0;  // count of negative integer
	int n_pos = 0;
	int maxneg = 0; // maximum negative integer 
	int minpos = 0; // minimum positive integer 
	int maxnegi = 0; // index of maxneg
	int minposi = 0; // index of minimum positive integer
	int zeroi = 0;   // index of zero
	int minneg = 0;
	int minnegi = 0;
	int out = -1;    // index of the val to be omitted 
	                 // when calculating result product
	int max = 1;
	
	/* collect some statistic info in one loop */
	for(int i = 0; i < n; i++)
	{
		if(a[i] < 0)  //a[i] is negative
		{
			n_neg++;
			if(maxneg == 0)
			{
				maxneg = a[i];
				maxnegi = i;
			}
			else if(maxneg < a[i])
			{
				maxneg = a[i];
				maxnegi = i;
			}
			
			if (minneg == 0) {
				minneg = a[i];
				minnegi = i;
			}
			else if (minneg > a[i]) {
				minneg = a[i];
				minnegi = i;
			}
		}
		else if(a[i] == 0) // a[i] is zero
		{
			zeroi = i;
			if(++n_zero > 1) return 0;
		}
		else // a[i] is positive
		{
			n_pos++;
			if(minpos == 0)
			{
				minpos = a[i];
				minposi = i;
			}
			else if(minpos > a[i])
			{
				minpos = a[i];
				minposi = i;
			}
		}
	}
 
 
	if((n_zero == 1) && (n_neg & 0x1))
	{
		// one zero and odd negatives
		return 0;
	}
	else if((n_zero == 1) && !(n_neg & 0x1))
	{
		// one zero and even negatives
		printf("one zero and even negatives\n");
		out = zeroi;
	}
	else if((n_zero == 0) && (n_neg & 0x1))
	{
		// no zero and odd negatives
		printf("no zero and odd negatives\n");
		out = maxnegi;
	}
	else if((n_zero == 0) && !(n_neg & 0x1))
	{
		// no zero and even negatives
		printf("no zero and even negatives\n");
		if (n_pos == 0){
			out = minnegi;
		}
		else {
			out = minposi;
		}
	}
	
	for(int i = 0; i < n; i++)
	{
		max *= (i == out) ? 1 : a[i];
	}
	return max;
}

int MaxSubProductv(int *a, int n)
{
	int n_zero = 0; // count of zero 
	int n_neg = 0;  // count of negative integer
	int n_pos = 0;  // count of positive integer
	int maxneg = 0; // maximum negative integer 
	int minpos = 0; // minimum positive integer 
	int maxnegi = 0; // index of maxneg
	int minposi = 0; // index of minimum positive integer
	int zeroi = 0;   // index of zero
	
	int minneg = 0;
	int minnegi = 0;
	
	int out = -1;         // index of the val to be omitted 
	                 // when calculating  product
	int max = 1;
	
	for(int i = 0; i < n; i++)
	{
		if(a[i] < 0)  //a[i] is negative
		{
			n_neg++;
			if(maxneg == 0)
			{
				maxneg = a[i];
				maxnegi = i;
			}
			else if(maxneg < a[i])
			{
				maxneg = a[i];
				maxnegi = i;
			}
			
			if (minneg == 0){
				minneg = a[i];
				minnegi = i; 
			}
			else {
				if (minneg > a[i]){
					minneg = a[i];
					minnegi = i;
				}
			} 
		}
		else if(a[i] == 0) // a[i] is zero
		{
			zeroi = i;
			if(++n_zero > 1) return 0;
		}
		else // a[i] is positive
		{
			n_pos++;
			if(minpos == 0)
			{
				minpos = a[i];
				minposi = i;
			}
			else if(minpos > a[i])
			{
				minpos = a[i];
				minposi = i;
			}
		}
	}
 
 	if (n_zero){
 		printf("zeros.\n");
 		if (n_neg & 1)
 			return 0;
 		else
 			out = zeroi;
 	}
 	else {
 		printf("no zero.\n");
 		if (n_neg & 1)
 			out = maxnegi;
 		else if (n_pos == 0){
 			out = minnegi;
 		}
 		else {
 			out = minposi;
 		}
 	}
		
	for(int i = 0; i < n; i++)
	{
		max *= (i == out) ? 1 : a[i];
	}
	return max;
}


void show(int a[],int n)
{
	for(int i = 0; i < n; i++){
		printf("%-3d",a[i]);
	}
	printf("\n");
}
int main()
{
	int a[6];
	int N = 6;
	srand(time(NULL));
	for(int i = 0; i < N; i++){
		a[i] = rand() % 10 ; 
		if (a[i] & 0x1)
			a[i] = -a[i];
	}
	show(a,N);
	printf("Max Sub Product of N-1 elements: %d .\n",MaxSubProducti(a,N));
	printf("Max Sub Product of N-1 elements: %d .\n",MaxSubProductii(a,N));
	printf("Max Sub Product of N-1 elements: %d .\n",MaxSubProductiii(a,N));
	printf("Max Sub Product of N-1 elements: %d .\n",MaxSubProductiv(a,N));
	printf("Max Sub Product of N-1 elements: %d .\n",MaxSubProductv(a,N));
} 

测试输出:

2  -5 -5 -5 -7 2  
Max Sub Product of N-1 elements: 1750 .
Max Sub Product of N-1 elements: 1750 .
Max Sub Product of N-1 elements: 1750 .
no zero and even negatives
Max Sub Product of N-1 elements: 1750 .
no zero.
Max Sub Product of N-1 elements: 1750 .


REF:

1,编程之美 2.13



VizCut 全自动批量视频二次去重处理!支持视频无水印解析下载和批量剪辑,完全免费,使用简单! 可制作和分享剪辑模板,已提供20+种剪辑方案,内置众多扫光蒙版素材。支持二次去重批量处理,完全免费,无广告,且支持视频无水印解析下载,非常强大。如果说我们处理的视频需要进行一样的参数设置的话,就可以把我,1设置的参数设置为模板,后面就可以一键调用。1. 本地CPU处理,可设置线程数,可开启GPU加速,无任何限制,全看机器性能。适用场景:自媒体搬运、短视频二创、批量去重等,完全免费,无广告干扰!3. 20+种参数可调可选,内置很多相关素材。可保存为模板,可复用、可分享、可导入。2. 所有参数的设置, 阅读详情

相关推荐

Navicat Premium 12 永久激活保姆级教程(附最新补丁下载)

本文详细介绍了Navicat Premium 12的高效使用方法,从安装配置到高级功能应用,帮助用户充分发挥这款数据库管理工具的全部潜力。内容包括数据库连接管理、数据查询与编辑、数据同步与结构对比等核心功能,以及性能优化和最佳实践建议,提升数据库管理效率。

weixin_28834765的博客 641

**动态规划算法求最大子数组和,并输出最大子数组下标**

已经知道求出最大子数组和的思路:遍历求出dp[i]数组中的最大值即为最大子数组和。 如何求出最大子数组下标? 由dp[i]的定义,子数组结束位置为max(dp[i])的下标i 求起始位置方法: 可建立一维数组rec[n],初始化为0 当dp[i]=nums[i]时,rec[i]=0; Dp[i]=nums[i]+dp[i-1]时,rec[i]=1; 这样,设已知的最大子数组结束位置下标为i,若i=0,则起始下标=结束下标=i 否则,从已知的结束位置i逆序遍历rec数组直到遇见0为止。 输出最后遍历到的r..

qq_44102625的博客 973

海康工业相机SDK开发实战:从环境搭建到实时图像采集(附避坑指南)

本文详细介绍了海康工业相机SDK在Windows平台上的开发实战流程,涵盖从环境搭建、运行时库路径配置到实时图像采集的全过程。重点解析了MVS SDK部署、设备连接、参数设置及图像处理等核心环节,并提供了实用的避坑指南和错误排查方法,帮助开发者构建稳定的机器视觉系统。

weixin_29248611的博客 845

力扣——乘积最大子数组

对应的最大乘积,如【0 -2 -3】,对于-2,最大乘积是0,对于-3,最大乘积是6,用上面的公式就是错误的。所以,我们除了记住最大乘积max,也要记住最小乘积min,因为下个元素可能会使最大最小发生转换。但是,用上面的公式是错误的,因为存在负数,会把最大的变成最小的,反之亦然。这里的子数组都是连续的元素,可以是元素本身。位置有关,所以不需要数组,用两个数分别代表。对应的最大乘积不一定是。

weixin_49332521的博客 2656

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 534

东方财富 vs 新浪 vs AKShare:3 种股票实时数据接口性能与稳定性实测对比

本文深度评测了东方财富、新浪和AKShare三种股票实时数据接口的性能与稳定性。通过实际测试数据,从延迟、成功率和数据完整性三个维度进行全面对比,为量化交易和数据分析开发者提供选型参考。结果显示,东方财富接口在实时性和稳定性方面表现最优,适合高频交易场景。

weixin_30800807的博客 386

LeetCode 之 乘积最大子数组

乘积最大子数组1. 暴力遍历2. 动态规划2.1 定义子问题2.2 状态转移方程2.3 返回最值2.4 报错解决3. 空间优化参考链接 题目要求找出数组 nums 中乘积最大的连续子数组,最直接的办法是遍历整个数组,穷举以数组元素 nums[i] 为开头的所有连续子数组,通过比较所有连续子数组的乘积,找到最大值,并返回。 可是穷举所有子数组的乘积的过程中,存在很多重复计算。因此可以考虑使用动态规划的思想来优化算法。 知识点: 动态规划及其空间优化 1. 暴力遍历 这种方法通过穷举所有可能的结果,得到最大值

qq_39220334的博客 1781

【向量数据库】Milvus向量数据库 ① 从入门到实战

Milvus是专为海量高维向量设计的开源数据库,支持AI搜索、图像识别、推荐系统等场景。相比传统关系型数据库(如PostgreSQL),它更高效处理语义检索、非结构化数据存储,可毫秒级响应亿级向量查询。单机场景下,推荐配置8GB内存/32GB硬盘,支持FAISS/HNSW等索引算法,支持GPU加速。本文涵盖优快云专属部署教程(CentOS脚本/配置调优),提供避坑指南与扩展资源,并对比分析与传统数据库差异。适合算法工程师、AI开发人员快速上手,附官方下载与性能测试技巧,手把手教你搭建高效向量检索系统!

xiezhiyi007的专栏 1586

【leetcode热题】乘积最大子数组

给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个整数。6子数组 [2,3] 有最大乘积 6。0结果不能为 2, 因为 [-2,-1] 不是子数组。

kiugvui的博客 1672

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南)

本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。

weixin_42543046的博客 460

[LeetCode][C++]乘积最大子数组

乘积最大子数组 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 思路: 方法一: 对每个元素求出最大连续乘积。 将所有元素的最大连续乘积进行比较,求出最大值。 方法二:动态规划 最小值乘一个负数,则可能成为最大值。

qq_41221520的博客 2081

YOLOv11魔改高效涨点 | 注意力篇 | SimAM注意力:基于神经科学的 3D 注意力机制,三维权重的暴力美学,无参数也能暴力涨点?代码极简,彻底疯狂!!!

在本文中,我们为卷积神经网络(ConvNets)提出了一个概念简单但非常有效的注意力模块。与现有的通道注意力(Channel-wise)和空间注意力(Spatial-wise)模块不同,我们的模块在不向原始网络添加参数的情况下,推断出层中特征图的 3D 注意力权重。具体来说,我们基于一些知名的神经科学理论,提出优化一个能量函数来寻找每个神经元的重要性。我们进一步推导出了该能量函数的快速闭式解,并表明该解可以用不到十行代码实现。

猫天意的博客 248

Leetcode 152. 乘积最大子数组

Leetcode 152. 乘积最大子数组1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/maximum-product-subarray/   本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #incl

珍惜 9217

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

乘积最大子数组

乘积最大子数组 1、参考资料 https://leetcode-cn.com/problems/maximum-product-subarray/ 2、题目要求 题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

Oneby的博客 561

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【LeetCode】乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 849

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

乘积最大子数组 【动态规划】

乘积最大子数组 【动态规划】 题目链接 题意:给出一个数组,要求一个子数组,使得子数组中所有元素乘积最大。 思路:最大值乘以一个负数之后可能变为最小值    最小值乘以一个负数之后可能成为最大值 用maxx[i]记录以第i个元素结尾的子数组乘积最大值 用minn[i]记录以第i个元素结尾的子数组乘积最小值 于是有: maxx[i]=max{maxx[i-1]*num[i],minn[i-1]*nu...

qq_38600065的博客 2087

最大子数组乘积

题目链接 动态规划的典型题目,这道题实际上是最大连续子数组和的一个进阶版本。这道题的难点在于,这里要同时构建两个辅助数组。 f(n)f(n)f(n)代表从区间[0,n][0,n][0,n]内,以n为结尾的最大乘积。与之相对的,g(n)g(n)g(n)代表从区间[0,n][0,n][0,n]内,以n为结尾的最小乘积 动态转移的方程是这样的 f(n)=max{f(n−1)×a[n],a[n],g(n−1)×a[n]}f(n)=max\{f(n-1)\times a[n],a[n],g(n-1)\times a[

BCQCCB的博客 266

乘积最大连续子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字) 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 思路:维护一个最大值、最小值;每次碰到小于0的值;我们让min,max值进行交换;这样便能维持住当前最大值、最小值; 这里比如2,3,-2,4;到-2的时候;此时最大6,min是3;显然此时如果计算到-2后;最大是...

Lemon 2716

152. 乘积最大子数组

Title 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 Solve 动态规划 如果当前位置是一个负数的话,那么我们希望在它前面一个位置的某一段的积也是个负数,并且尽可能小,负负得正。 如果当前位置是一个正数的话,那么

Alex 422

Leetcode-100乘积最大子数组

给定一个整数数组nums,找出数组中乘积最大的非空连续子数组(至少包含一个数字),返回其对应乘积。要求结果在 32 位整数范围内。输入:nums = [2,3,-2,4]输出:6解释:子数组 [2,3] 的乘积是 6,其余子数组乘积均小于 6。

2501_90713548的博客 1110

动态规划-乘积最大子数组

与最大乘积类似,最小乘积的更新也考虑了当前元素、前一个位置的最小乘积乘以当前元素,以及前一个位置的最大乘积乘以当前元素(当当前元素为负数时)。这是因为,负数乘以正数(前一个位置的最大乘积)会得到一个更小的负数,这可能是新的最小乘积。给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积。本身(如果前面的元素都是负数或者乘积小于当前元素),要么是前面位置的最大乘积。数组中的最大值即为所求的最大乘积子数组的乘积。

2302_80190174的博客 869
上一篇: 最大公约数问题
下一篇: 子数组之和的最大值(二维)
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值