• [剑指Offer] 42.和为S的两个数字


    题目描述

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

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

    【思路】同LeetCode中的Two Sum类似,但由于要将乘积最小的一组输出,因此需要一个辅助函数Sift来将不符合条件的删除。

     1 class Solution
     2 {
     3 public:
     4     void Sift(vector<int> &vec)
     5     {
     6         int minid = 0;
     7         int num = vec.size();
     8         vector<int> multi(num/2);
     9         for(int i = 0,j = 0; i < num; i = i + 2,j ++)
    10         {
    11             multi[j] = vec[i]*vec[i+1];
    12         }
    13         for(int i = 1; i < num/2; i ++)
    14         {
    15             if(multi[minid] > multi[i])
    16             {
    17                 vec[minid*2] = vec[minid*2+1] = -1;
    18                 minid = i;
    19             }
    20             else
    21             {
    22                 vec[i*2] = vec[i*2+1] = -1;
    23             }
    24         }
    25         for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); )
    26         {
    27             if (*iter == -1)
    28             {
    29                 if (++iter == vec.end())
    30                 {
    31                     vec.erase(--iter);
    32                     break;
    33                 }
    34                 else iter = vec.erase(--iter);
    35             }
    36             else
    37                 ++iter;
    38         }
    39     }
    40 
    41     vector<int> FindNumbersWithSum(vector<int> array,int sum)
    42     {
    43         vector<int> res;
    44         if(array.size() < 2) return res;
    45         int target = 0;
    46         vector<int> temp;
    47         for(int i = 0; i < array.size(); i ++)
    48         {
    49             target = sum - array[i];
    50             if(find(temp.begin(),temp.end(),target) != temp.end())
    51             {
    52                 res.push_back(target);
    53                 res.push_back(array[i]);
    54             }
    55             else
    56             {
    57                 temp.push_back(array[i]);
    58             }
    59         }
    60         Sift(res);
    61         return res;
    62     }
    63 };
  • 相关阅读:
    Git标签使用技巧
    Git入门基本概述
    过滤器+缓存在.NET5WebApi项目中的简单使用
    在.NET5中 使用JWT鉴权授权
    Git常用开发命令
    时间戳的实际使用
    两个日期字段相减,进行计算
    MQ的理论理解
    第一周学习C语言的总结!
    问题(the question)
  • 原文地址:https://www.cnblogs.com/lca1826/p/6520188.html
Copyright © 2020-2023  润新知