输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
时间消耗O(n),空间消耗O(1)
该算法没有利用数组是有序的这个信息,虽然算法时间也是O(n),但是空间消耗也是O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <stdafx.h> #include<vector> #include<iostream> #include <unordered_map> using namespace std; vector< int > FindNumbersWithSum( vector< int > array, int sum ) { vector< int > result; int size =array. size(); if (size <2) return result; unordered_map< int , int > m_map; for ( int i=0; i<size ;i++){ m_map[array [i]]= i; } vector<vector < int > > results; for ( int i=0; i<size ;i++){ const int gap= sum-array [i]; if (m_map .find( gap)!=m_map .end() && m_map[gap ]>i){ result.clear (); result.push_back (array[ i]); result.push_back (gap); results.push_back (result); } } int results_num =results. size(); int i_index =0, time =999999999; if (results_num <2) return result; else { for ( int i=0; i<results_num ;i++){ int tmp =results[ i][0]*results [i][1]; if (tmp < time ){ time =tmp ; i_index=i ; } } result=results [i_index]; } return result ; } int main () { int a [20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; vector< int > test( a,a +20); vector< int >result= FindNumbersWithSum(test ,21); return 0; } |
时间消耗O(n),空间消耗O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution { public : vector< int > FindNumbersWithSum(vector< int > array, int sum) { int i = 0 ; int j = array.size()- 1 ; vector< int > result; while (i < j) { if (array[i] + array[j] == sum) { result.push_back(array[i]); result.push_back(array[j]); return result; } else if (array[i] + array[j] > sum) j--; else i++; } return result; } }; |