剑指offer42

剑指offer42:和为S的两个数字

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,
使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:
对应每个测试案例,输出两个数,小的先输出。

解法一:基于暴力法

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array, int sum) {
        int flag = INT_MAX;
        vector<int> b(2, -1);
        for (int i = 0; i<array.size(); i++)
            for (int j = i + 1; j<array.size(); j++)
            {
                if (array[i] + array[j] == sum)
                {
                    if (array[i] * array[j]<flag)
                    {
                        b[0] = array[i];
                        b[1] = array[j];
                        flag = b[0] * b[1];
                    }

                }
            }
        if (b[0] + b[1] != -2)
            return b;
        else
            return {};

    }
};

解法二:基于map的方法

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array, int sum) {
        map<int, int> mp;
        vector<int> b(2, -1);
        int flag = INT_MAX;
        for (int i = 0; i<array.size(); i++)
        {
            mp[array[i]] = i;
            if (mp.count(sum - array[i]) && mp[sum - array[i]] != i)
            {
                if (flag>(array[i] * (sum - array[i])))
                {
                    b[1] = array[i];
                    b[0] = sum - array[i];
                    flag = b[0] * b[1];
                }
            }
        }
        if (flag<INT_MAX)
            return b;
        else
            return {};
    }
};

   转载规则


《剑指offer42》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Leetcode485 Leetcode485
Leetcode485:最大连续1的个数 题目描述示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度
2020-04-26
下一篇 
剑指offer40 剑指offer40
剑指offer40:最小的K个数 题目描述输入n个整数,找出其中最小的K个数。 例如输入4,5,1,6,2,7,3,8这8个数字, 则最小的4个数字是1,2,3,4,。 解法一:基于sort排序的方法class Solution { pu
2020-04-25
  目录