首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

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

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

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

热点排行