和为k的连续区间

题目描述

一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间i, j,(1 <= i <= j <= n),使得ai + ... + aj = k。

输入格式

第1行:2个数n,k。n为数列的长度。k为需要求的和。(2 <= n <= 10000,-10^9 <= k <= 10^9) 第2 - n+1行:ai(-10^9 <= ai <= 10^9)。

输出格式

如果没有这样的序列输出No Solution。 输出2个数i, j,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。

样例
输入样例
复制代码
6 10
1
2
3
4
5
6
输出样例
复制代码
1 4

一些想法

这题的题目是在一堆数字中,是否有几个连续的数字等于 k 。这道题我的想法是用 map 做:先设定一个 map 用于记录前缀和出现的次数,n 是有几个输入的数,k 是需要等于的数,数组 sum 用于存储前缀和(前缀和是指某序列的前n项和)。

(跳过输入)当前 sumi 表示当前输入的数的前缀和是多少,sumi=sumi-1+x; 表示前输入的数的前缀和等于上一个数的前缀和加上现在输入的数,然后当前前缀和次数加一(用于后面判断某个前缀和是否存在)。

然后开一个新的循环,从 0 循环到 n-1,从 0 开始是因为 要以防万一有的答案只包含一个数(第一个数就能达到要求),到 n-1 结束时因为后面的另一个循环是从 i~n 的,i=n-1 可以让后面的值等于 n ,如果不按这个写有可能会无法找到存在的正确答案。

然后如果 map[sum[i]+m] 为真,意味着存在一个后缀的前缀和(因为后缀的前缀和减前缀前缀和等于两个数之间的差值,而如果这个差值等于目标值,说明找到答案了,这里用反向思维,将上面的公式反向推过来,那么后缀的前缀和就等于前缀的前缀和加上目标值),继续开一个新的循环,从 i+1 到 n,表示在 i 到最后所有可能的值一个个找符合标准的数字,如何前一个前缀和减去后一个前缀和等于目标值,输出前一个数加一(因为从 0 开始循环),和输出后一个数,输出完后直接结束程序。

关于上面的一段重要解析有许些混乱,所以我借助了 AI 更清晰地解析一下,意思基本相同,但是表述更加清晰:
准确地说,如果mapsum\[i+k]为真,意味着存在一个位置j(j > i),使得从数组开头到位置j的前缀和sumj等于sumi+k,即存在一个从i + 1到j的连续子数组的和为k。

再循环外输出 No Solution(没有找到符合的数)。

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
map<long long,int> b;
int n,k,sum[10005];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		sum[i]=sum[i-1]+x;
		b[sum[i]]++;
	}
	for(int i=0;i<=n-1;i++){
		if(b[sum[i]+k]){
			for(int j=i+1;j<=n;j++){
				if(sum[j]-sum[i]==k){
					cout<<i+1<<" "<<j;
					return 0; 
				}
			}
		}
	}
	cout<<"No Solution";
	return 0;
}
相关推荐
YLCHUP1 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀2 小时前
背包DP(01背包+完全背包)
c++·算法
旖旎夜光3 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu4 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
nice_lcj5204 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
꧁细听勿语情꧂4 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的5 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
Pniubi17 小时前
关于算法用现成数据结构和手撕
数据结构
老歌老听老掉牙1 天前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso