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

本篇完!🍗

相关推荐
wabs66643 分钟前
关于哈希表【力扣15.三数之和的思考】
数据结构·算法·leetcode·散列表·哈希表·三数之和
退休倒计时1 小时前
【每日一题】LeetCode 88. 合并两个有序数组 TypeScript
算法·leetcode·职场和发展·typescript
星轨初途2 小时前
LeetCode 热题 100——day10 和为 K 的子数组
开发语言·c++·算法·leetcode
疯狂打码的少年2 小时前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
evans在进步2 小时前
LeetCode 17:电话号码的字母组合——Java DFS 回溯法详解
java·leetcode·深度优先
Hi李耶3 小时前
【LeetCode】17.电话号码的字母组合
算法·leetcode·职场和发展
Doraemomo11 小时前
数据结构-环形链表
java·数据结构·链表
Forever Nore12 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
爱跳舞的烤冷面15 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
MC皮蛋侠客17 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis