0
点赞
收藏
分享

微信扫一扫

排序【数据结构】【算法】

目录

T1. 找和为 K 的两个元素

在一个长度为 n   ( n < 1000 ) n\ (n < 1000) n (n<1000) 的整数序列中,判断是否存在某两个元素之和为 k k k

时间限制:1 s
内存限制:64 MB

  • 输入
    第一行输入序列的长度 n n n k k k,用空格分开。
    第二行输入序列中的 n n n 个整数,用空格分开。
  • 输出
    如果存在某两个元素的和为 k k k,则输出 yes,否则输出 no
  • 样例输入
    9 10
    1 2 3 4 5 6 7 8 9
  • 样例输出
    yes

思路分析

此题考查枚举算法,属于入门题。

常规思路下,用两层循环分别枚举 a i a_i ai a j a_j aj,检测若 a i + a j = k a_i + a_j = k ai+aj=k,则输出 yes。若在枚举结束仍然没有检测到任何一对元素满足 a i + a j = k a_i + a_j = k ai+aj=k,则输出 no

事实上,我们可以将 a a a 序列排序之后,采用双指针技巧做到更快速的枚举。具体来说,设置 i = 1 , j = n i=1,j=n i=1,j=n

  • a i + a j = k a_i + a_j = k ai+aj=k,则输出 yes,并结束程序;
  • a i + a j < k a_i + a_j < k ai+aj<k,则将 i i i 向后移动,即 i++
  • a i + a j > k a_i + a_j > k ai+aj>k,则将 j j j 向前移动,即 j--
  • i = j i = j i=j,则枚举过程结束,输出 no
/*
 * Name: T1.cpp
 * Problem: 找和为 K 的两个元素
 * Author: Teacher Gao.
 * Date&Time: 2024/11/17 21:58
 */

#include <cstdio>
#include <algorithm>

using namespace std;

int main()
{
   
	int n, k, a[1005];
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);

	sort(a + 1, a + n + 1);

	for (int i = 1, j = n; i < j; ) {
   
		if 
举报

相关推荐

0 条评论