编程之美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]+" ");}}}}
阅读全文
0 0
- 编程之美2.13 子数组的最大乘积
- 编程之美2.13 子数组的最大乘积
- 编程之美2.13 子数组的最大乘积
- 编程之美---子数组最大乘积
- 编程之美之"子数组的最大乘积"
- 子数组的最大乘积-编程之美
- 编程之美----子数组的最大乘积
- [编程之美]子数组的最大乘积
- 编程之美 子数组的最大乘积
- 编程之美:子数组的最大乘积
- 编程之美--子数组的最大乘积
- [编程之美] PSet2.13 子数组的最大乘积
- 编程之美 - 子数组的最大乘积
- 编程之美_子数组的最大乘积
- 编程之美-2.13 子数组最大乘积
- 读书笔记之编程之美 - 2.13 子数组的最大乘积
- 编程之美:第二章 数字之魅 2.13子数组的最大乘积
- 子数组的最大乘积——编程之美2.13
- vs2012项目向vs2015项目平台迁移错误号C4996'fopen': This function or variable may 的解决方法
- 【视频开发】ffmpeg实现dxva2硬件加速
- JAVA sha1
- 【视频开发】【CUDA开发】ffmpeg nvenc编码
- 数据库优化方案
- 编程之美2.13 子数组的最大乘积
- 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案
- JAVA AES128
- I2C调试
- JAVA MD5
- codeforces 379G. New Year Cactus
- 爬虫生活实录之---百度文库文档破解
- Coderforces George and Accommodation
- 简单图片浏览器