오름차순 배열에서 입력 숫자 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에 따라 라이센스가 부여됩니다.