用C语言实现:输入一个包含 n个整数的数组 a ,求数组中两个不同下标的数 a[i] 和 a[j] (i≠j ),使得 a[i]×a[j] 的值最大。其中2≤n≤10^5 ,−10^6≤a[i]≤10^6
时间: 2023-05-29 21:01:15 浏览: 152
C语言程序设计-把20个随机数存入一个数组,然后输出该数组中的最小值;其中确定最小值的下标的操作在fun函数中实现
5星 · 资源好评率100%
【题目描述】
输入一个包含 n 个整数的数组 a,求数组中两个不同下标的数 a[i] 和 a[j] 使得 a[i]*a[j] 的值最大。其中 2≤n≤10^5,−10^6≤a[i]≤10^6。
【样例输入】
5
-2 3 1 -5 0
【样例输出】
10
【分析】
首先想到的是暴力解法,两重循环枚举每一对不同下标,但这样时间复杂度是 O(n^2),显然会超时。考虑优化。
因为这里要求的是两个数相乘的最大值,我们可以将数组中的数按照绝对值大小从大到小排序,然后将排在前面的正数和排在后面的负数相乘,即可找到乘积最大的两个数。
但是如果数组中只有正数或只有负数,则没法同时选出两个数,因此需分类讨论:
1. 数组中有正数和负数
将数组中的数按照绝对值大小从大到小排序,然后找到第一个正数的下标和最后一个负数的下标,对应的两个数相乘即可。
2. 数组中只有正数或只有负数
最大的两个数相乘即可。
【代码实现】
阅读全文