【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m

💓 博客主页:倔强的石头的CSDN主页

📝Gitee主页:倔强的石头的gitee主页

⏩ 文章专栏:C语言刷题系列

目录

一、问题描述

二、解题思路

解题思路:

解题步骤:

三、C语言代码实现及测试


一、问题描述

给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum

注意:

给定的数组是有序的

a和b是全局变量,不需要返回值

二、解题思路

解题思路:

利用数组的有序性,通过双指针在数组中同时从两端向中间遍历,逐步逼近目标和,从而找到最接近给定和的两个数

解题步骤:

初始化变量

  • 创建两个变量left和right分别指向数组首尾(相当于左指针和右指针)
  • 创建一个整型变量min_diff存储两个元素的差值,初始化为整型最大值

双指针遍历

  • while循环,循环条件是左右指针未相遇
  • 循环中对left和right指向的元素相加求和存放到变量sum中
  • 先判断,将sum与整数m进行比较,如果相等的话,直接将两个元素赋值给a和b,return即可
  • 如果不相等再执行下面代码
  • 求sum与整数m做差的绝对值,将差值绝对值与min_diff进行比较
  • 如果新的差值较小,则min_diff等于新的差值,并改变a和b为当前的left和right指向的两个元素
  • 接下来将sum与整数m进行比较
  • 如果sum较大,right--
  • 如果sum较小,left++

输出结果

  • 出循环时,a和b存储的就是最接近整数m的值

三、C语言代码实现及测试

cpp 复制代码
//求一个数组中两个元素a和b的和最接近整数m
#include<stdio.h>
#include<limits.h>
int a = 0, b = 0;//全局变量
void fun(int* arr, int numsSize,int m)
{
    int left = 0;//左指针
    int right = numsSize - 1;//右指针
    int min_diff = INT_MAX;//存储最小差值
    while (left <= right)
    {
        int sum = arr[left] + arr[right];
        if (sum == m)//如果元素和等于m,直接返回
        {
            a = arr[left];
            b = arr[right];
            return;
        }
        int tmp_diff = abs(sum - m);//存储当前差值
        if (tmp_diff < min_diff)//如果当前元素更接近,更新数据
        {
            min_diff = tmp_diff;
            a = arr[left];
            b = arr[right];
        }
        if (sum > m)
            right--;
        if (sum < m)
            left++;
    }
}

int main()
{
    int arr[] = { 2,4,6,8,10,11,14,16,18 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int m = 13;
    fun(arr, sz, m);
    printf("最接近整数m=%d的a和b的值是%d,%d\n", m, a, b);
    return 0;
}
相关推荐
海兰4 小时前
【 Python 量化交易】开篇
开发语言·python·信息可视化·量化交易
我的xiaodoujiao5 小时前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
l1t5 小时前
DeepSeek总结的DuckDB在 CI 中为 release 和 glibc CLI 构建启用 LTO - #24225
开发语言·数据库·ci/cd·duckdb
whitelbwwww5 小时前
c++运行RKNN
开发语言·c++
2601_962070235 小时前
差异基因富集分析(R语言——GO&KEGG&GSEA)
开发语言·golang·r语言
布莱克6055 小时前
栈(Stack)详解:定义、作用、应用场景及与队列的区别(附 C/C++ 代码)
c语言·开发语言·c++·
zmzb01035 小时前
C++课后习题训练记录Day203
开发语言·c++
wuyk5555 小时前
从零吃透 Modbus 通信|第 6 章:线圈功能码 05/0F 实现 & Modbus‑TCP 基础入门
c语言·网络·网络协议·tcp/ip
zzzll11115 小时前
LangChain4j:Java 生态的 AI 应用开发利器
java·开发语言·人工智能
JAI科研6 小时前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm