当前位置: 首页 > article >正文

AI刷题-子数组和的最大值问题

目录

问题描述

输入格式

输出格式

输入样例

输出样例

说明

数据范围

解题思路:

问题理解

数据结构选择

算法步骤

具体步骤

代码实现: 

1.特判: 不需要删除元素的时候

 2.在前面的判断结束后:k+1,,这是为了应对需要减去一个数字的时候(要保证减了之后剩k个数)

 3.然后就进行滑动窗口计数

 4.枚举找到最小值:

 最终代码:

运行结果:​编辑 


 

问题描述

给定整数数组,我们称其中连续的0个或多个整数为一个子数组,求删除任一元素后,新数组中长度为k的子数组的和的最大值。

输入格式

  • 第一行输入为NKN代表数组长度,K代表子数组长度
  • 第二行输入为N个整数,依次为数组的每个元素

输出格式

一个整数S,代表所有可能新数组中长度为K的子数组的和的最大值。

输入样例

5 3  
2 1 3 -1 4

输出样例

8

说明

选择删除第四个元素,新数组为2 1 3 4,其长度为3的子数组的和是8

数据范围

  • 50% case:1≤K<N≤100,−100≤arr[i]≤1001≤K<N≤100,−100≤arr[i]≤100
  • 100% case:1≤K<N≤1×106,−100≤arr[i]≤1001≤K<N≤1×106,−100≤arr[i]≤100

解题思路:

问题理解

我们需要在一个整数数组中,删除一个元素后,找到新数组中长度为 k 的子数组的和的最大值。

数据结构选择

  • 由于我们需要频繁地计算子数组的和,使用前缀和数组(Prefix Sum Array)可以有效地减少计算时间。

算法步骤

  1. 计算前缀和:首先计算原始数组的前缀和数组,这样可以快速计算任意子数组的和。
  2. 枚举删除元素:对于每个可能删除的元素,计算删除该元素后的新数组中长度为 k 的子数组的和。
  3. 更新最大值:在枚举过程中,记录并更新最大子数组和。

具体步骤

  1. 前缀和数组

    • 创建一个前缀和数组 prefix_sum,其中 prefix_sum[i] 表示从数组开头到第 i 个元素的和。
    • prefix_sum[i] = prefix_sum[i-1] + nums[i]
  2. 删除元素后的子数组和

    • 对于每个元素 nums[i],计算删除该元素后的新数组中长度为 k 的子数组的和。
    • 删除 nums[i] 后,新数组中长度为 k 的子数组的和可以通过前缀和数组快速计算。
  3. 更新最大值

    • 在枚举删除元素的过程中,记录并更新最大子数组和。

 

代码实现: 

1.特判: 不需要删除元素的时候

// 如果数组长度恰好为 k,不需要删除元素
    if (n == k) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        return sum;
    }

 2.在前面的判断结束后:k+1,,这是为了应对需要减去一个数字的时候(要保证减了之后剩k个数)

k++;

 3.然后就进行滑动窗口计数

// 滑动窗口计算长度为 k 的最大和
    int maxSum = INT_MIN, windowSum = 0, min = nums[0];
    for (int i = 0; i < k; i++) {
        windowSum += nums[i];
        min = std::min(min, nums[i]);
    }
maxSum = windowSum - min;

 4.枚举找到最小值:

// 枚举找到最小值
    for (int i = k; i < n; i++) {
        windowSum += nums[i] - nums[i - k];
        min = nums[i];
        for (int j = i - k + 1; j <= i; j++) {
            min = std::min(min, nums[j]);
        }
        maxSum = std::max(maxSum, windowSum - min);
    }

 最终代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

int solution(int n, int k, const std::vector<int>& nums) {
	// 如果数组长度恰好为 k,不需要删除元素
	if (n == k) {
		int sum = 0;
		for (int num : nums) {
			sum += num;
		}
		return sum;
	}
	k++;
	
	// 滑动窗口计算长度为 k 的最大和
	int maxSum = INT_MIN, windowSum = 0, min = nums[0];
	for (int i = 0; i < k; i++) {
		windowSum += nums[i];
		min = std::min(min, nums[i]);
	}
	maxSum = windowSum - min;
	
	// 枚举找到最小值
	for (int i = k; i < n; i++) {
		windowSum += nums[i] - nums[i - k];
		min = nums[i];
		for (int j = i - k + 1; j <= i; j++) {
			min = std::min(min, nums[j]);
		}
		maxSum = std::max(maxSum, windowSum - min);
	}
	
	return maxSum;
}

int main() {
	// Add your test cases here
	std::cout << (solution(5, 3, {2, 1, 3, -1, 4}) == 8) << std::endl;
	return 0;
}

运行结果: 

 

 

 

 


http://www.kler.cn/a/540708.html

相关文章:

  • 【分布式理论7】分布式调用之:服务间的(RPC)远程调用
  • 音频进阶学习十一——离散傅里叶级数DFS
  • 【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)
  • DeepSeek之Win10系统部署教程
  • 【异常解决】在idea中提示 hutool 提示 HttpResponse used withoud try-with-resources statement
  • antd pro常见代码示例-ProTable
  • 【Java 面试 八股文】Redis篇
  • 数字电路-基础逻辑门实验
  • Day 32 卡玛笔记
  • 基于 GEE 的网格化降雨数据可视化与时间序列分析
  • DeepSeek与AI提示语设计的全面指南
  • 【信息系统项目管理师-案例真题】2018上半年案例分析答案和详解
  • DeepSeek本地部署(解决ollama无法安装问题)
  • 【Java基础篇】——第4篇:Java常用类库与工具类
  • 深度学习-108-大语言模型LLM之基于langchain的结构化输出功能提取结构化信息
  • at coder ABC 392
  • Apache Kafka 消息清理之道
  • 【大数据安全分析】为什么要用大数据技术进行安全分析?
  • 【人工智能】如何在VSCode中使用DeepSeek?
  • 牛客周赛 Round 79 C-小红的小球染色
  • 网络安全应急响应总结阶段 网络安全应急工作
  • Winform开发框架(蝇量级) MiniFramework V2.1
  • mysql8.0使用PXC实现高可用
  • Include多表查询
  • ECG分析0210
  • 软件工程-软件需求规格说明(SRS)