剑指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;
}

本篇完!🍗

相关推荐
小明说Java4 小时前
常见排序算法的实现
数据结构·算法·排序算法
smj2302_796826526 小时前
解决leetcode第3768题.固定长度子数组中的最小逆序对数目
python·算法·leetcode
cynicme6 小时前
力扣3531——统计被覆盖的建筑
算法·leetcode
圣保罗的大教堂8 小时前
leetcode 3531. 统计被覆盖的建筑 中等
leetcode
小熳芋9 小时前
验证二叉搜索树- python-递归&上下界约束
数据结构
不穿格子的程序员12 小时前
从零开始写算法——链表篇2:从“回文”到“环形”——链表双指针技巧的深度解析
数据结构·算法·链表·回文链表·环形链表
诺....13 小时前
C语言不确定循环会影响输入输出缓冲区的刷新
c语言·数据结构·算法
Tisfy13 小时前
LeetCode 3531.统计被覆盖的建筑:最大最小值
算法·leetcode·题解·桶排序