剑指offer--和为s的数字

题目描述🍗

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

算法分析🍗

算法1:遍历所有的数字,查看其它(后面所有的)数字和当前数字相加是否为s。O(n^2)

cpp 复制代码
//arr:数组起始地址
//len:数组长度
//s:需要的和
void SumTos(int* arr, int len, int s)//O(n^2)
{
    for (int i = 0; i < len; i++)//遍历所有数字
    {
        for (int j = i + 1; j < len; j++)//遍历i后面所有的数字
        {
            if (arr[i] + arr[j] == s)
                printf("%d+%d=%d\n",arr[i],arr[j],s);
        }
    }
}

int main()
{
    int arr[] = {1,2,4,7,8,11,15};
    int len = sizeof(arr) / sizeof(arr[0]);
    int s = 15;
    SumTos(arr,len,s);

    return 0;
}

算法2.利用数据有序,用两个下标,一个在最前面,另一个在最后面,两个值相加如果等于s即找到,如果小于s则前面的下标往后移,如果大于s则后面的下标前移。

cpp 复制代码
//arr:数组起始地址
//len:数组长度
//s:需要的和
void SumTos(int* arr, int len, int s)//O(n)
{
    int low = 0;
    int high = len - 1;
    int sum;//和
    while (low < high)//输出所有和为s的数字
    {
        sum = arr[low] + arr[high];
        if (sum == s)
        {
            printf("%d+%d=%d\n", arr[low], arr[high], s);
            low++;
        }

        else if (sum < s)//low后移
            low++;
        else //sum>s ,high前移
            high--;
    }
}

int main()
{
    int arr[] = {1,2,4,7,8,11,15};
    int len = sizeof(arr) / sizeof(arr[0]);
    int s = 15;
    SumTos(arr,len,s);

    return 0;
}

本篇完!🍗

相关推荐
小南家的青蛙13 分钟前
LeetCode LCR 085 括号生成
算法·leetcode·职场和发展
晨非辰42 分钟前
《数据结构风云》递归算法:二叉树遍历的精髓实现
c语言·数据结构·c++·人工智能·算法·leetcode·面试
wudl556643 分钟前
Pandas-DataFrame 数据结构详解
数据结构·pandas
Dream it possible!1 小时前
LeetCode 面试经典 150_链表_LRU 缓存(66_146_C++_中等)(哈希表 + 双向链表)
c++·leetcode·链表·面试
_dindong3 小时前
牛客101:二叉树
数据结构·c++·笔记·学习·算法
潼心1412o7 小时前
数据结构(长期更新)第5讲:单链表算法题
数据结构
小白菜又菜7 小时前
Leetcode 3370. Smallest Number With All Set Bits
算法·leetcode·职场和发展
s砚山s10 小时前
代码随想录刷题——二叉树篇(一)
c++·算法·leetcode
小十一再加一11 小时前
【数据结构初阶】单链表
数据结构
ZIM学编程13 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php