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

来源:互联网 发布:java面试题大全带答案 编辑:程序博客网 时间:2024/06/08 04:01
// 题目:给一个长度为N的数组,N-1个子元素相乘最大的子元素组合// 解法1:建立数组s和t分别存储从前到后和从后向前元素相乘的结果,最后用p存储除了当前元素之外其他元素的乘积,时间复杂度O(N),空间复杂度O(N)public class Main {public static void main(String[] args) {findNum(new int[] { 5, 6, 8, 3, 7, 9, 4 });}public static void findNum(int[] input) {int[] s = new int[input.length];int[] t = new int[input.length];int[] p = new int[input.length];s[0] = 5;s[input.length-1] = 1;t[0] = 1;t[input.length-1] = input[input.length-1];for(int i = 1;i<input.length-1;i++){//分别前向后向计算s和t数组中的累计相乘结果s[i] = s[i-1]*input[i];}for(int i = input.length-2;i>0;i--){t[i] = t[i+1]*input[i];}p[0] = t[1];p[input.length-1] = s[input.length-2];for(int i = 1;i<input.length-1;i++){//p[i] = s[i-1] * p[i+1]p[i] = s[i-1]*t[i+1];}int index = 0;int max = 0;for(int i = 0;i<p.length;i++){if(p[i]>max){index = i;max = p[i];}}for(int i = 0;i<input.length;i++){if(i == index){continue;}System.out.print(input[i]+" ");}}}// 解法2:根据n个数子相乘结果为正负或0来判断应该做什么操作,如果是正的就去掉一个最小的正数,如果是负的就去掉一个绝对值最小的负数//如果是0,则判断去掉0之后为正负或0,为正就返回正,为负返回0,为0也返回0,时间复杂度O(N),没有辅助空间public class Main {public static void main(String[] args) {findNum(new int[] { 5, -6, -8, -3, 7, 9, -4 ,0});}public static void findNum(int[] input) {int nevCount = 0;int zeroCount = 0;for(int i = 0;i<input.length;i++){//统计数组中0的个数和负数的个数if(input[i]<0){nevCount++;}if(input[i] == 0){zeroCount++;}}if(zeroCount >= 2){System.out.println("随机选择就可以,因为最大的N-1个数都为0");return;}if(zeroCount == 1){int t = 1;for(int i = 0;i<input.length;i++){if(input[i] == 0){continue;}t = t*input[i];}if(t<0){System.out.println("包含一个0,最大乘积为0");return;}if(t>0){for(int i = 0;i<input.length;i++){if(input[i] == 0){continue;}System.out.print(input[i]+" ");}return;}}int min = 999;int index = 0;if(nevCount%2 == 0){//如果结果为正,则去掉那个最小的正数for(int i = 0;i<input.length;i++){if(Math.abs(input[i])<min && input[i]>0){min = Math.abs(input[i]);index = i;}}for(int i = 0;i<input.length;i++){if(i == index){continue;}System.out.print(input[i]+" ");}}else{//如果结果为负,则去掉那个绝对值最小的负数for(int i = 0;i<input.length;i++){if(Math.abs(input[i])<min && input[i]<0){min = Math.abs(input[i]);index = i;}}for(int i = 0;i<input.length;i++){if(i == index){continue;}System.out.print(input[i]+" ");}}}}

原创粉丝点击