매일 하나의 알고리즘 문제 (2): 주어진 배열 Arr 와 하나의 정수 am, 어느 두 위치의 수 를 되 돌려 am 을 추가 할 수 있 습 니까?
2522 단어 알고리즘
예 를 들 어 arr = {2, 7, 11, 15}, target = 9 는 {0, 1} 으로 돌아 갑 니 다. arr [0] + arr [1] = 2 + 7 = 9 는 각 배열 에 한 조 의 답 만 있다 고 가정 할 수 있 습 니 다.
대략 절 차 는 이렇다.
우선, 배열 을 정의 합 니 다.배열 의 위 치 를 기록 하 다.배열 을 정렬 하고 정렬 하 는 과정 에서 값 을 교환 하면 위 치 를 저장 하 는 배열 도 이에 따라 교환 합 니 다.
우 리 는 두 변 수 를 정의 할 수 있다.배열 의 시작 위 치 를 가리 키 며 배열 의 끝 위 치 를 가리킨다.
시작 위치 와 끝 위치 가 am 보다 크 면 끝 위치 --.
시작 위치 와 끝 위치 에 작은 am 을 더 하면 시작 위치 +.
같 으 면 배열 내 원래 위치 로 돌아 갑 니 다.
자세 한 코드 는 다음 과 같 습 니 다.
#include
#include
using namespace std;
// ,
void swap(vector &nums, vector &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 &nums, int start, int end, vector &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 &nums, vector &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 &nums, vector &help, vector &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 nums;
nums.push_back(2);
nums.push_back(11);
nums.push_back(7);
nums.push_back(15);
vector help;
vector 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
물체 검출의 평가 지표 IoU의 계산 방법Yolo나 SSD 등 물체 검출에서 평가 지표로 사용되는 IoU에 대해 조사했으므로 정리했습니다. IoU (Intersection over Union)는 두 영역이 얼마나 겹치는지를 나타내는 지표입니다. 두 영역의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.