递增数组中寻找和正好是S的数

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

首先,这是一个有序的递增数组。从头到尾,首尾相加,求是否大于求和的值,然后进行调整。如果小于了左边可以右移,大于S的话右边界左移。

#include <iostream>
#include <vector> 
using namespace std;
//找出所有和为定值的数的下标  从1计数
vector< pair<int,int>> getSumNum(vector<int> &arr,int Sum)
{
    vector<pair<int,int>> vec;
    int i,j;
    int len = arr.size()-1;
    for(i = 0, j = len; i < j ;)
    {
        if(arr[i] + arr[j] == Sum){
            vec.push_back(make_pair(i+1,j+1));
            i++;
            j--;
        }
        else if(arr[i] + arr[j] < Sum)
            i++;
        else
            j--;
    }
    return vec;
}
//找乘积最小就是第一个,如果是乘积最大就求中位数的两个值比较一下就OK啦 
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<pair<int,int>>  temp = getSumNum(array,sum);
        vector<int> result;
        result.push_back(array[temp[0].first-1]);//从0计数
        result.push_back(array[temp[0].second-1]);
        return result;
}

int main(){
    vector<int> n={1,2,4,5,7,9,11};
    vector<pair<int,int>>  temp = getSumNum(n,9);
    for(auto t:temp){
        cout<<t.first<<" "<<t.second<<endl;
    } 
    vector<int>  tp = FindNumbersWithSum(n,9);
    for(auto t:tp){
        cout<<t<<endl;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,235评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,288评论 0 2
  • 今天是纪台二中军训的第二天,同学们经过昨天一天的军训体验,第二天同学们已经基本成型,但是我们还是对他们不能放松,...
    你大爷的滚阅读 432评论 0 0