数组的求和与极值
时间: 2025-06-14 10:38:48 浏览: 13
### 数组求和与极值的算法实现方式
数组求和与极值问题在计算机科学中是一个常见的任务,涉及对数组中的元素进行操作以找到特定的结果。以下是几种常见的算法及其代码示例。
#### 1. 最小子数组和
该问题的目标是找到两个数组的所有可能组合中最小的前 `count` 个和,并返回这些和的总和[^3]。
```java
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String arr1Str = input.nextLine();
String arr2Str = input.nextLine();
int count = input.nextInt();
int[] arr1 = parseArr(arr1Str);
int[] arr2 = parseArr(arr2Str);
ArrayList<Integer> allSum = new ArrayList<>(arr1.length * arr2.length);
for (int n : arr1) {
for (int m : arr2) {
allSum.add(n + m);
}
}
Collections.sort(allSum);
int sum = 0;
for (int i = 0; i < count; i++) {
sum += allSum.get(i);
}
System.out.println(sum);
}
private static int[] parseArr(String arrStr) {
String[] strings = arrStr.split(" ");
int[] arr = new int[strings.length];
for (int i = 0; i < strings.length; i++) {
arr[i] = Integer.parseInt(strings[i]);
}
return arr;
}
}
```
#### 2. 乘积小于 K 的子数组数量
此问题要求计算数组中所有乘积小于给定值 `k` 的连续子数组的数量[^1]。
```java
public int numSubarrayProductLessThanK(int[] nums, int k) {
if (k <= 1) return 0;
int left = 0, product = 1, count = 0;
for (int right = 0; right < nums.length; right++) {
product *= nums[right];
while (product >= k) {
product /= nums[left++];
}
count += right - left + 1;
}
return count;
}
```
#### 3. 最大子数组和(Kadane 算法)
Kadane 算法用于找到数组中的最大子数组和,其时间复杂度为 O(n)。
```python
def max_sub_array(nums):
if not nums:
return 0
current_sum = max_sum = nums[0]
for num in nums[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)
return max_sum
```
#### 4. 滑动窗口最大值
使用单调队列(Deque)来维护滑动窗口的最大值,时间复杂度为 O(n)[^1]。
```python
from collections import deque
def maxSlidingWindow(nums, k):
dq = deque()
result = []
for i in range(len(nums)):
while dq and nums[dq[-1]] <= nums[i]:
dq.pop()
dq.append(i)
if dq[0] == i - k:
dq.popleft()
if i >= k - 1:
result.append(nums[dq[0]])
return result
```
### 结论
以上方法涵盖了从简单到复杂的数组求和与极值问题解决策略,包括最小和、最大子数组和以及滑动窗口最大值等问题。每种方法都有其特定的应用场景和优化策略。
阅读全文
相关推荐


















