文章目录
一个原创题
商最大子数组
题目描述
给定一个长度为 n 的整数数组 nums(所有元素均不为 0) ,请找出数组中商最大的非空连续子数组,返回该子数组对应的商。
子数组是数组中一段连续的元素。
子数组的商定义为:从左到右依次进行除法运算。即若子数组为 a1,a2,...,ak(k≥1),则其商为:a1/a2/a3/.../ak
运算顺序严格按照从左到右,不可调换顺序,不可添加括号。
单个元素的商等于该元素本身。
除法运算中除数始终不为 0(输入保证所有元素非零)。
注意:商可能是负数,最大商指代数最大值,例如 (3>0.5>−1 ),自己去总结要保留的小数位。
输入格式
第一行一个整数 n
第二行 n 个整数,表示数组 nums
输出格式
输出一个浮点数,表示最大商的数值。
输入样例
4
-12 -2 -3 4
输出样例
6.0
说明:
-12, -2 = -12 / -2 = 6 就是最大商
其他子数组如 -12, -2, -3 = -2,4 = 4,均小于 6。
输入样例
4
-100 -1 2 3
输出样例
100.0
参考代码如下:
cpp
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin>>n;
vector<ld> a(n);
for (int i=0;i<n;i++) cin>>a[i];
ld Max=a[0];
ld Min=a[0];
ld res=a[0];
for (int i=1;i<n;i++) {
ld tempMax=Max;
ld tempMin=Min;
Max=max(max(tempMax/a[i],tempMin/a[i]),a[i]);
Min=min(min(tempMax/a[i],tempMin/a[i]),a[i]);
res=max(res,Max);
}
cout << fixed << setprecision(1) << res << endl;
return 0;
}
备选样例
样例一
输入样例
6
-5 1 1 1 1 -1
输出样例
5.0
样例二
输入样例
5
-1 -1 -1 -1 -1
输出样例
1.0
样例三
输入样例
3
-1000000000000000000 -1 2
输出样例
1000000000000000000.0
样例四
输入样例
5
-256 -1 -1 -1 -1
输出样例
256.0
样例五
输入样例
6
2 -3 4 -5 6 -7
输出样例
6.0
样例七
输入样例
4
-7 -2 1 3
输出样例
3.5
样例八
输入样例
1
-5
输出样例
-5.0
样例九
输入样例
2
-10 -3
输出样例
3.3
样例十
输入样例
3
-100 1 -2
输出样例
50.0
说明:此题改编自力扣152题乘积最大子数组,其实我再把那个题写了后就想到了这个思路,本学生学识浅薄,希望大佬们多多提出意见!!!