오름차순 배열에서 입력 숫자 n과 같게 두 수를 선택합니다.
제목 설명
이것은 한 인터넷 회사의 면접 문제로 승차순으로 정렬된 수조와 하나의 숫자 n을 입력하여 수조에서 두 개의 수를 찾아 그들의 합이 그 입력 숫자 n과 꼭 같도록 요구한다.만약 숫자의 합이 n과 같으면 임의의 쌍을 출력하면 된다.
소박한 해법
두 변수 i와 j를 사용하여 두 층의 순환을 이용하여 수조를 훑어보고 데이터 [i]+데이터 [j]가 입력 숫자와 같고 i가 j와 같지 않을 때 데이터 [i]와 데이터 [j]를 출력하면 원하는 두 개의 숫자를 찾을 수 있다.다음은 이 해법의 코드입니다.void find1(int *data,int num)
{
assert(NULL!=data);
int i=0;
int j=0;
for(i=0;i<len;i++)
for(j=0;j<len;j++)
{
if((i!=j)&&((data[i]+data[j])==num))
{
printf(" %d + %d = %d
",data[i],data[j],num);
return;
}
}
printf(" not find them
");
return;
}
이런 해법의 시간 복잡도는 o(n^2)이고 승차수조라는 조건을 충분히 이용하지 못했다는 것을 쉽게 알 수 있다.
더욱 합리적인 해법
우리는 두 변수로 수조의 첫 번째 원소와 마지막 원소, 즉 수조의 최소값과 최대값을 찾을 수 있다.이 두 숫자의 합이 입력 숫자 n과 같으면 결과를 출력하면 된다.만약 두 숫자의 합이 n보다 작으면 오른쪽으로 작은 값을 가리키는 변수를 이동한다.만약 두 숫자의 합이 n보다 크면, 비교적 큰 값을 가리키는 변수를 왼쪽으로 이동합니다.판단이 끝나는 조건은 두 변수가 중합되는 것이다.
다음은 이 해법의 코드입니다.void find2(int *data,int num)
{
assert(NULL!=data);
int i=0;
int j=len-1;
while(i<j)
{
if((data[i]+data[j])==num)
{
printf(" %d + %d = %d
",data[i],data[j],num);
return;
}
else if((data[i]+data[j])< num)
{
i++;
}
else
{
j--;
}
}
printf(" not find them
");
return;
}
소결
두 번째 해법의 시간 복잡도는 o(n)로 첫 번째 해법보다 우수하고 제목 중의 승차수조의 조건을 충분히 이용할 수 있음을 분명히 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
"5G"의 비즈니스 모델
ICT 비즈니스는 "지금, 미국에서 일어나고 있는 일이 3~5년 후에 일본에서 일어난다""지금 중국이 가장 진행되고 있어 그것을 쫓는 일본"이라고 생각되기 쉽지만, 5G의 비즈니스는 그렇다고는 말할 수없는 상황에 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
두 변수 i와 j를 사용하여 두 층의 순환을 이용하여 수조를 훑어보고 데이터 [i]+데이터 [j]가 입력 숫자와 같고 i가 j와 같지 않을 때 데이터 [i]와 데이터 [j]를 출력하면 원하는 두 개의 숫자를 찾을 수 있다.다음은 이 해법의 코드입니다.
void find1(int *data,int num)
{
assert(NULL!=data);
int i=0;
int j=0;
for(i=0;i<len;i++)
for(j=0;j<len;j++)
{
if((i!=j)&&((data[i]+data[j])==num))
{
printf(" %d + %d = %d
",data[i],data[j],num);
return;
}
}
printf(" not find them
");
return;
}
이런 해법의 시간 복잡도는 o(n^2)이고 승차수조라는 조건을 충분히 이용하지 못했다는 것을 쉽게 알 수 있다.
더욱 합리적인 해법
우리는 두 변수로 수조의 첫 번째 원소와 마지막 원소, 즉 수조의 최소값과 최대값을 찾을 수 있다.이 두 숫자의 합이 입력 숫자 n과 같으면 결과를 출력하면 된다.만약 두 숫자의 합이 n보다 작으면 오른쪽으로 작은 값을 가리키는 변수를 이동한다.만약 두 숫자의 합이 n보다 크면, 비교적 큰 값을 가리키는 변수를 왼쪽으로 이동합니다.판단이 끝나는 조건은 두 변수가 중합되는 것이다.
다음은 이 해법의 코드입니다.void find2(int *data,int num)
{
assert(NULL!=data);
int i=0;
int j=len-1;
while(i<j)
{
if((data[i]+data[j])==num)
{
printf(" %d + %d = %d
",data[i],data[j],num);
return;
}
else if((data[i]+data[j])< num)
{
i++;
}
else
{
j--;
}
}
printf(" not find them
");
return;
}
소결
두 번째 해법의 시간 복잡도는 o(n)로 첫 번째 해법보다 우수하고 제목 중의 승차수조의 조건을 충분히 이용할 수 있음을 분명히 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
"5G"의 비즈니스 모델
ICT 비즈니스는 "지금, 미국에서 일어나고 있는 일이 3~5년 후에 일본에서 일어난다""지금 중국이 가장 진행되고 있어 그것을 쫓는 일본"이라고 생각되기 쉽지만, 5G의 비즈니스는 그렇다고는 말할 수없는 상황에 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
void find2(int *data,int num)
{
assert(NULL!=data);
int i=0;
int j=len-1;
while(i<j)
{
if((data[i]+data[j])==num)
{
printf(" %d + %d = %d
",data[i],data[j],num);
return;
}
else if((data[i]+data[j])< num)
{
i++;
}
else
{
j--;
}
}
printf(" not find them
");
return;
}
두 번째 해법의 시간 복잡도는 o(n)로 첫 번째 해법보다 우수하고 제목 중의 승차수조의 조건을 충분히 이용할 수 있음을 분명히 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
"5G"의 비즈니스 모델ICT 비즈니스는 "지금, 미국에서 일어나고 있는 일이 3~5년 후에 일본에서 일어난다""지금 중국이 가장 진행되고 있어 그것을 쫓는 일본"이라고 생각되기 쉽지만, 5G의 비즈니스는 그렇다고는 말할 수없는 상황에 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.