解题思路
这是一个区间最值问题。通过观察可以发现,当选择整个数组作为区间时,区间和固定为所有数字之和,而区间最小值就是数组中的最小值。
关键点:
- 区间和固定为所有数字之和
- 区间最小值必定是数组中的某个数
- 要使结果最大,应选择包含最小值的最大区间
- 排序后第一个数就是最小值
算法步骤:
- 计算数组总和
- 找到数组最小值
- 计算最小值与总和的乘积
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
long long maxIntervalValue(vector<int>& nums) {
// 计算数组总和
long long sum = 0;
for (int num : nums) {
sum += num;
}
// 找到最小值
int minVal = *min_element(nums.begin(), nums.end());
// 返回最小值与总和的乘积
return sum * minVal;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
Solution solution;
cout << solution.maxIntervalValue(nums) << endl;
return 0;
}
import java.io.*;
import java.util.*;
public class Main {
static class Solution {
public long maxIntervalValue(int[] nums) {
// 计算数组总和
long sum = 0;
int minVal = Integer.MAX_VALUE;
for (int num : nums) {
sum += num;
minVal = Math.min(minVal, num);
}
// 返回最小值与总和的乘积
return sum * minVal;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] nums = Arrays.stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt)
.toArray();
Solution solution = new Solution();
System.out.println(solution.maxIntervalValue(nums));
}
}
class Solution:
def max_interval_value(self, nums: list) -> int:
# 计算数组总和和最小值
total_sum = sum(nums)
min_val = min(nums)
# 返回最小值与总和的乘积
return total_sum * min_val
if __name__ == "__main__":
n = int(input())
nums = list(map(int, input().split()))
solution = Solution()
print(solution.max_interval_value(nums))
算法及复杂度
- 算法:一次遍历
- 时间复杂度:,其中 是数组长度
- 空间复杂度:,只需要常数空间