博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大乘积(大佬的代码)
阅读量:7088 次
发布时间:2019-06-28

本文共 1184 字,大约阅读时间需要 3 分钟。

题目描述

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积
示例1

输入

3 4 1 2

输出

24 我看别人的代码很多都是if else用了很麻烦之后就看到了这个代码 基本思路:用选择排序的思路找到最大的3个数和最小的3个数 时间复杂度O(6n) 最大乘积只有三种情况 1.最大的三个数相乘(全是负数或者全是正数的情况) 2.最小的两个负数再乘以最大的正数 从这两种中取最大的即可 循环加数组尽量简化代码 在这里我再帮大家复习一下选择排序的基本思路: 第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换; 第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换; 以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
因为我们只需要找到最大的3个元素和最小的3个元素,所以i直接取<3其余都和选择排序的思想基本类似 代码如下:
#include
#include
using namespace std; const int maxn = 1e6;long long arr[maxn]; int main(){ int n; long long maxi[3], mini[3], ans; cin>>n; for(int i = 0; i < n; i++) scanf("%lld", &arr[i]); for(int i = 0; i < 3; i++){ for(int j = i + 1; j < n; j++) if(arr[j] > arr[i]) swap(arr[j], arr[i]); maxi[i] = arr[i]; } for(int i = 0; i < 3; i++){ for(int j = i + 1; j < n; j++) if(arr[j] < arr[i]) swap(arr[j], arr[i]); mini[i] = arr[i]; } ans = max(maxi[0]*maxi[1]*maxi[2],maxi[0]*mini[0]*mini[1]); printf("%lld\n", ans);}

 

转载于:https://www.cnblogs.com/cstdio1/p/11041901.html

你可能感兴趣的文章
Eclipse 调试 Java 程序的技巧
查看>>
Project Euler 95:Amicable chains 亲和数链
查看>>
HTML5调用传感器的资料汇总
查看>>
maven安装配置
查看>>
全民Scheme(0):lat的定义
查看>>
[转]Worksheet.Change Event (Excel)
查看>>
cpu性能探究 :cache line 原理
查看>>
mysql忘记root密码拯救方法(flush privileges)
查看>>
[转载]UML用例图总结
查看>>
LinkedBlockingQueue
查看>>
Lucene.Net+盘古分词器(详细介绍)(转)
查看>>
HDU 4902 Nice boat(线段树)
查看>>
正确理解Python文件读写模式字w+、a+和r+
查看>>
不可不知的DIP、IoC、DI以及IoC容器
查看>>
大漠教程 找字 找图片
查看>>
不同时间复杂度的规模上限
查看>>
Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
查看>>
怎样调通微信支付及微信发货通知接口(Js API)
查看>>
Android 属性动画(Property Animation) 全然解析 (下)
查看>>
推断汉字正則表達式更严谨方法!
查看>>