zoukankan      html  css  js  c++  java
  • 和为S的两个数字

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
    题目描述
    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
    输出描述:
    对应每个测试案例,输出两个数,小的先输出。

    思路:
    首先来说下,题目中要输出两个数的乘积最小,具体指的是什么呢?
    假设b>a,且存在a+b=s,有

    [(a-m)+(b+m) = s; ]

    [(a-m)(b+m) = ab-(b-a)m-m^2<ab ]

    这说明最外层的乘积更小。
    目标明确后,开始解题。

    同样采用双指针的方法,不过左指针left指向数列的头,右指针right指向数列的尾,求left、right两指针所指数据之和

    1. 如果和 等于sum值,则将left和right数据进行保存并返回
    2. 如果小于sum值,说明和太小了,将left指针右移寻找更大的数
    3. 如果大于sum值,说明和太大了,将right指针左移寻找更小的数
    class Solution {
    public:
        vector<int> FindNumbersWithSum(vector<int> array,int sum) {
            vector<int> saveElem;
            if(array.empty())
            {
                return saveElem;
            }
            int left = 0;
            int right = array.size()-1;
            while(left < right)
            {
                if(array[left] + array[right] == sum)
                {
                    saveElem.push_back(array[left]);
                    saveElem.push_back(array[right]);
                    break;
                }
                while(left< right &&array[left]+array[right]<sum)
                    left++;
                while(left<right && array[left] + array[right] > sum)
                    right--;
            }
            return saveElem;
        }
    };
    
  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/whiteBear/p/12618929.html
Copyright © 2011-2022 走看看