알고리즘 서론 2.3 - 7 (정렬 되 지 않 은 배열) 과 검 지 offer 면접 문제 41 (정렬 배열)

제목 요구: 알고리즘 서론 2.3 - 7: 실행 시간 이 O (nlgn) 인 알고리즘 을 제시 하여 n 개의 정수 로 구 성 된 집합 S 와 다른 정수 x 를 지정 할 때 S 에 x 와 같은 요소 가 두 개 있 는 지 판단 합 니 다.만약 여러 쌍 의 숫자 와 S 가 있다 면, 그 중 한 쌍 을 출력 하면 된다.
알고리즘 서론 의 문제 풀이 방향: 모두 배열 에 먼저 병합 순 서 를 하고 시간 복잡 도 는 O (nlgn) 이 며 후속 방법 은 두 문제 가 일치 합 니 다.
방법 1: 1. 두 개의 지침 을 각각 배열 의 머리 와 꼬리 2, 계산 과 2.1 을 가리 키 며 목표 보다 크 면 꼬리 지침 은 앞으로 이동 합 니 다. 2.2 목표 보다 작 으 면 머리 지침 은 뒤로 이동 합 니 다.
bool FindNumberWithSum(int *data,int length,int sum,int *num1,int *num2)  
{  
    if(data==nullptr || length<=0 || num1==nullptr || num2==nullptr)  
        return false;  
    bool isfound = false;  

    int fount = 0,tail = length -1;  
    while(fount < tail)  
    {  
        if(data[fount] + data[tail]== sum)  
        {  
            isfound = true;  
            *num1 = data[fount];  
            *num2 = data[tail];  
            break;  
        }  
        else if(data[fount] + data[tail] > sum)  
            tail--;  
        else  
            fount++;  
    }  

    return isfound;  
}  

코드 에 while 순환 이 양 끝 에서 중간 으로 배열 을 스 캔 하기 때문에 알고리즘 의 시간 복잡 도 O (n)
방법 2: 이분 검색 법 으로 y, y = x - a [i] 를 찾 습 니 다. 알고리즘 의 시간 복잡 도 는 nlogn 보다 작 기 때문에 전체적인 시간 복잡 도 는 nlogn 입 니 다.
//               
bool binary_search(int a[],int v,int begin,int end)  
{  
    int left=begin,right=end;
    int mid=0;
    while(left<=right){
        mid=(left+right)/2;
        if(a[mid]==v)
            return True;
        else if(a[mid]<v)
            left=mid+1;
        else
            right=mid-1;
    }
    return false;
}  
//    a        ,   x 
bool check_sum(int a[],int n,int x)  
{  
    sort(a);//     O(nlgn)      a    ,  《  》 
    for(int i=0;i<n;++i)  
        if(binary_search(a,x-a[i],0,n-1))  
            return true;  
    return false;  
}  

좋은 웹페이지 즐겨찾기