`

求出整型数组s[n]中任意n-1个数的乘积的最大值,不能用除法,要求时间复杂度为o(n)

    博客分类:
  • J2SE
 
阅读更多
public class TestRide {
	//第一种方法
	public static long ride2(int[] data) {
		int length = data.length;
		long[] front = new long[length];// 下标i之前的数的积(不包括i)
		long[] back = new long[length];// 下标i之后的数的积(不包括i)
		front[0] = 1;
		back[length - 1] = 1;
		for (int i = 1; i < length; i++) {
			front[i] = front[i - 1] * data[i - 1];
			back[length - i - 1] = back[length - i] * data[length - i];
		}

		long result = back[0];
		for (int i = 1; i < length; i++) {
			long temp = front[i] * back[i];
			if (temp > result) {
				result = temp;
			}
		}
		return result;
	} 
	//第二种方法
	public static long ride(int[] data) {
		int pMin = 0; // 最小自然数数的下标
		int sMax = 0; // 最大负数的下标
		int sMin = 0; // 最小负数的下标
		int sSize = 0; // 负数的个数
		int zeroNum = 0; // 零的个数
		int index = 0; // 要去掉的那一个数的下标
		long result = 1; // n-1个数相乘的最大结果
		boolean pflag = true;
		boolean sflag = true;
		for (int i = 0; i < data.length; i++) {
			if (data[i] < 0) {
				sSize++;
				if (sflag) {
					sMax = i;
					sMin = i;
					sflag = false;
					continue;
				}
				if (data[sMax] < data[i]) {
					sMax = i;
				}
				if (data[sMin] > data[i]) {
					sMin = i;
				}
			} else if (data[i] >= 0) {
				if (pflag) {
					pMin = i;
					pflag = false;
				}
				if (data[i] == 0)
					zeroNum++;
				if (data[pMin] > data[i]) {
					pMin = i;
				}
			}

		}
		if (zeroNum > 1)
			return 0;
		if (sSize % 2 == 1) {
			index = sMax;
		} else if (sSize == data.length) {
			index = sMin;
		} else {
			index = pMin;
		}
		for (int i = 0; i < data.length; i++) {
			if(i == index) continue;
			result *= data[i];
		}
		return result;
	}

	public static void main(String[] args) {
		int[] data = new int[] { 5, 2, -5, 4, 9, -6, 1, 0, };
		int[] data2 = new int[] { -5, -2, -5, -4 };
		System.out.println(ride(data));
		System.out.println(ride2(data));
		System.out.println(ride(data2));
		System.out.println(ride2(data2));
	}

}

 输出结果:

10800
10800
-40
-40

分享到:
评论

相关推荐

    算法 子数组最大乘积

    3. **时间复杂度分析**:计算`s[]`和`t[]`的时间复杂度为`O(N)`,计算`p[]`的时间复杂度也为`O(N)`,再加上查找`p[]`中的最大值的时间复杂度`O(N)`,总的时间复杂度为`O(N)`。 #### 解法二:简化分析 **核心思想**...

    算法分析求最大公约数

    【算法分析求最大公约数】涉及的是在编程领域中如何高效地找到两个正整数的最大公约数(Greatest Common Divisor, GCD)。本实验旨在通过C++编程语言,设计并分析不同算法的效率,同时结合时间复杂性的理论进行实际...

    ACM常用模板及北大ACM-题型分类代码

    - **定义**: 给定一个数组,求所有连续子数组的和的最大值。 - **应用场景**: 在数据挖掘、模式识别等领域。 - **实现方法**: - 可以使用动态规划的方法求解。 #### 子阵和 -- 求sum{a[0..m-1][0..n-1]} - **定义...

    用高精度算N阶乘,编程语言c++,acm经典题型之一...

    当n变得非常大时,这个乘积会超出C++标准库中提供的整数类型的最大值。 为了处理这种高精度计算,我们需要自定义一种数据结构,通常称为“大数”类。这个类可以由一个数组表示,每个元素存储一个位或者是一个子块,...

    c++程序实例

    该程序在一个预定义的二维数组中查找最大值,并返回该值所在的行标和列标。 **代码分析:** ```cpp main() { int a[4][3] = {{1, 2, 3}, {82, 56, 7}, {88, 63, 8}, {79, 93, 9}}; int i, j, max_i = 0, max_j =...

    最大公约数——三种算法

    质因数分解法是将两个数分别分解成质因数的乘积,然后找出共同的质因数,将这些质因数相乘得到的最大值即为最大公约数。例如,a = p1^e1 * p2^e2 * ... * pn^en,b = q1^f1 * q2^f2 * ... * qm^fm,其中pi和qi是...

    编程练习题

    - 使用高精度除法算法计算这两个数的商和余数。 - 分别输出商和余数。 - **注意事项:** - 输入整数长度可达200位,需确保能正确处理每一位的除法操作。 - 第二个数的范围较小,只需关注第一位即可判断是否需要...

    java50道经典练习题.docx

    输入一个数组,将数组中的最大值与第一个元素交换,最小值与最后一个元素交换。 **知识点解析:** - **数组操作**:学习如何查找最大值和最小值。 - **数组交换**:使用临时变量交换数组中的元素。 - **算法设计**...

    NOIP2000年提高组解题报告

    + 问题描述:给出一个长度为N的数字串,要求使用K个乘号将它分成K+1个部分,使得这K+1个部分的乘积能够为最大。 + 解题思路:使用动态规划,通过状态转移方程推出所有状态的最优值,最后f[n,k]即为答案。 * 题目...

    lintcode算法分析和解答

    - 找出数组中两个连续子数组的和,它们的差值最小。 - **旋转排序数组的恢复(Recover Rotated Sorted Array)** - 数组被旋转了若干次,恢复其排序状态。 - **数组中除自身以外其余元素的乘积(Product of Array ...

    数论模板精心整编

    这段代码使用了递归的方式来实现,基本思想是不断地用较小的数去除较大的数,直到两数相等时,则该数即为两数的最大公约数。 ### 4. lcm (最小公倍数) 最小公倍数(Least Common Multiple, LCM)是指能被几个给定...

    12. 剪绳子1

    4. 整数除法和取余运算在解决问题中的应用,如计算能剪出的 3 和 2 的段数。 5. 代码优化,例如通过预先处理特殊情况(n 或 n == 2 或 n == 3)来减少计算。 理解这些知识点有助于解决类似的优化问题,尤其是在资源...

    C++编程练习.pdf

    7. **有序数组插入**:在已排序的数组中插入一个数,保持数组有序,可以使用二分查找降低时间复杂度。 8. **数列循环移位**:对数组进行左移或右移操作,涉及数组元素的重新排列。 9. **顺序查找**:在数组中搜索...

    清华ACM常用代码

    - **功能**:求组合数,即从n个不同元素中选取k个元素的方法总数。 - **实现**:通过递归或迭代计算组合数。 #### 9. 快速傅立叶变换(FFT) - **功能**:用于多项式乘法和数字信号处理等领域。 - **实现**:利用...

    java算法与数据结构

    - 每层节点数的最大值为2^(h-1),其中h为树的高度。 - 深度为h的完全二叉树至少有2^(h-1)个节点。 **6.2.3 二叉树的存储结构** - **顺序存储**:对于完全二叉树,可以使用数组进行存储。 - **链式存储**:每个节点...

    BJFU算法设计与分析备考模板.docx

    - **定义**:在算法设计过程中,数据范围是指题目所给定的数据规模,包括输入数据的最大值、最小值以及数量等。 - **作用**:理解数据范围有助于选择合适的算法及数据结构,避免时间复杂度过高导致超时。 ##### ...

    最新JAVA编程题全集

    在算法设计上,我们首先需要找到最小的质数k,然后不断用k去除目标数n,直到不能再整除为止,这时k就是n的一个质因数。之后,将n除以k得到新的n,重复这个过程直到n变为1。值得注意的是,当k大于n的平方根时,若n仍...

    2017级数值分析第四次次作业.docx

    4. 将系数矩阵化为上三角矩阵的过程中,乘除法的运算次数等于n(n-1)/2,其中n是方程组的未知数数量。这是因为高斯消元法涉及n-1次行交换,每次行交换会涉及n-1次乘除法。 5. 回代求解阶段,从下往上依次求解未知数...

    Algorithm(纯英文)

    - **位数需求**:为了表示一个非负整数\(N\),在基数\(b\)下,我们需要\(\lceil \log_b (N+1) \rceil\)个数字位(大约\(\log_b N\)位,上下波动不超过1位)。 通过这些知识点的梳理,我们不仅可以了解到算法处理...

Global site tag (gtag.js) - Google Analytics