编程之美-2.13 子数组最大乘积

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

按照编程之美一书中所描述的解法1,时间复杂度O(N)。

基本原理:第i个元素被排除在乘积之外,则其他N-1个元素之积 subProductI [ i ]=preI[i] *postI[i]; preI[i] 为第1-(i-1)个元素之积,postI[i]为第(i+1)-N个元素之积。

preI, postI都是通过从前向后以及从后向前依次扫描得到的数组。preI[i] = preI[i - 1] * v[i - 1]; postI[i] = postI[i + 1] * v[i+ 1]; v为原始输入数组。

代码如下:

#include <iostream>
#include <vector>

using namespace std;
int findMaxProdSubArray(vector<int>v)
{
	int len = v.size();
	if (len<=1)
		return -1;
	vector<int>preI(len);
	vector<int>postI(len);
	vector<int>subProductI(len);
	preI[0] = 1;
	for (int i = 1; i < len; i++)
		preI[i] = preI[i - 1] * v[i - 1];
	postI[len-1] = 1;
	for (int i = len-2; i >=0; i--)
		postI[i] = postI[i + 1] * v[i+ 1];
	for (int i = 0; i <len; i++)
		subProductI[i] = preI[i] *postI[i];
	int max = subProductI[0];
	for (int i = 1; i <len; i++)
		if (max < subProductI[i])
			max = subProductI[i];
	return max;
}


k-means聚类算法是一种常用的无监督学习算法,它的目标是将数据集划分成k个簇,使得每个数据点都属于离它最近的簇。k-means算法通常通过随机初始化簇中心,迭代更新簇中心和重新分配数据点的方法来求解。然而,由于k-means算法高度依赖于初始化簇中心的质量,因此对于不同的数据集,其聚类结果可能会有很大的差异,而且k-means算法容易陷入局部最优解。 为了提高k-means算法的精度,可以采用以下方法: 1. 多次运行:对于同一个数据集,可以多次运行k-means算法,每次使用不同的随机初始化簇中心,然后选取最好的结果作为最终结果。 2. 增加簇数:增加簇数可以更细致地将数据集划分,从而提高聚类精度。但是过多的簇数会导致过拟合和聚类结果不稳定的问题,因此需要根据具体情况进行调整。 3. 使用谱聚类:谱聚类是一种基于图论的聚类算法,相比于k-means算法,它不依赖于随机初始化和簇中心的选择,因此具有更好的鲁棒性和可靠性。 4. 特征选择:在进行聚类前,可以对原始数据进行特征选择或降维操作,以提高聚类精度和降低计算复杂度。 5. 调整距离度量:对于不同的数据集,可能需要采用不同的距离度量方法,如欧式距离、曼哈顿距离等。 6. 人工干预:在一些特殊情况下,人工干预聚类过程也是一种有效的提高聚类精度方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值