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

简介: public class TestRide { //第一种方法 public static long ride2(int[] data) { int length = data.
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

目录
相关文章
|
8月前
|
索引
238.除自身以外数组的乘积
238.除自身以外数组的乘积
32 0
|
存储 索引
信息学奥赛 如何在整数数组中寻找两数之和等于给定目标值
本文介绍了在整数数组中寻找两个数之和等于给定目标值的问题,提供了两种解法:暴力法和哈希表法。通过比较两种解法的时间复杂度,指出了哈希表法更为高效。
128 0
|
8月前
|
算法 前端开发
二的幂数组中查询范围内的乘积
二的幂数组中查询范围内的乘积
41 0
除自身以外数组的乘积
除自身以外数组的乘积
50 0
|
自然语言处理 算法 Python
利用函数求出一个数组最大三个数的乘积
利用函数求出一个数组最大三个数的乘积
123 0
|
机器学习/深度学习 存储 算法
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
求出任意非负整数区间中1出现的次数
求出任意非负整数区间中1出现的次数
118 0
Java数组中找出两个相加等于某个值的数据下标
Java数组中找出两个相加等于某个值的数据下标
Java数组中找出两个相加等于某个值的数据下标