每天一道演算法題(二):給定陣列Arr和一個整數aim,請返回哪兩個位置的數可以加出aim來。
阿新 • • 發佈:2019-02-03
給定陣列Arr和一個整數aim,請返回哪兩個位置的數可以加出aim來
例如:arr={2,7,11,15},target = 9 返回{0,1},因為arr[0] + arr[1] = 2 + 7 = 9,可以假設每個數組裡只有一組答案。
大概流程是這樣的:
首先,定義一個數組。記錄陣列的位置。將陣列進行排序,在排序的過程中,如果值交換,則將儲存位置的陣列也隨之交換
我們可以定義兩個變數。一個指向陣列的起始位置,一個指向陣列末尾位置。
如果起始位置和末尾位置相加值大於aim,則末尾位置--。
如果起始位置和末尾位置相加值小aim,則起始位置++。
如果相等,返回陣列內的原來的位置。
詳細程式碼如下:
#include <iostream>
#include <vector>
using namespace std;
//如果交換,將輔助陣列和原陣列都要進行交換
void swap(vector<int> &nums, vector<int> &help,int m, int n)
{
int tmp = nums[m];
nums[m] = nums[n];
nums[n] = tmp;
tmp = help[m];
help[m] = help[n];
help[n] = tmp;
}
//構建最大堆 void maxHeap(vector<int> &nums, int start, int end, vector<int> &help) { int fNode = start; int sNode = 2*start+1; while (sNode <= end) { if (sNode+1 <= end && nums[sNode] < nums[sNode+1]) sNode++; if (nums[fNode] > nums[sNode]) return; else { swap(nums,help,sNode,fNode); fNode = sNode; sNode = fNode*2+1; } } }
//堆排序
void heapSort(vector<int> &nums, vector<int> &help)
{
int len = nums.size();
for(int i = len/2-1; i >= 0; i--)
{
maxHeap(nums, i, len-1, help);
}
for(int j = len-1; j >= 0; j--)
{
swap(nums, help, j ,0);
maxHeap(nums,0,j-1, help);
}
}
void twoNum(vector<int> &nums, vector<int> &help, vector<int> &res, int aim) { heapSort(nums,help); int left = 0; int right = nums.size()-1; int sum = 0; while (left != right)//排序完以後進行查詢 { sum = nums[left] + nums[right]; if (sum > aim) right--; if (sum < aim) left++; if (sum == aim) { res.push_back(left); res.push_back(right); return; } } res.push_back(-1); res.push_back(-1); }
int main(int argc, char* argv[])
{
vector<int> nums;
nums.push_back(2);
nums.push_back(11);
nums.push_back(7);
nums.push_back(15);
vector<int> help;
vector<int> res;
for(int i = 0; i < 4; i++)
{
help.push_back(i);
}
twoNum(nums, help, res,26);
for(i =0; i < 2; i++)
{
cout << res[i] << "\t" ;
}
cout << endl;
cin.get();
return 0;
}