Likou 167. 두 숫자의 합 II- 입력 순서 배열 (이진 검색)

167. 두 숫자의 합 II- 입력 순서 배열

오름차순으로 배열 된 정수 배열 숫자가 주어지면 배열에서 목표 숫자 목표의 합을 만족하는 두 숫자를 찾으십시오.

이 함수는 길이 2의 정수 배열 형식으로이 두 숫자의 아래 첨자 값을 반환해야합니다. 숫자의 아래 첨자는 1부터 세기를 시작하므로 답 배열은 1 <= answer [0] <answer [1] <= numbers.length를 충족해야합니다.

각 입력이 고유 한 답변에만 해당되며 동일한 요소를 재사용 할 수 없다고 가정 할 수 있습니다.

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
 

提示:

2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 递增顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案

대답:

우리 모두 알다시피, 정렬 된 배열을 검색 할 때 종종 이분법을 사용하여 시간 복잡성을 줄입니다.
따라서이 문제는 이진 검색을 사용하여 해결할 수 있습니다.

이 질문은 전통적인 이분법과 같지 않습니다.이 질문은 두 개의 숫자를 찾는 것 입니다.
우리는 기존의 이분법로 변환 할 수 있습니다 , 즉, 무작위로 대상을 구성하는 요소 중 하나와 같은 요소를 선택 , 다음 값이 원래의 배열의 목표 원래 선택한 요소 요소를 찾기 위해 이분법을 사용합니다 . 직접 찾으면 That 's it을 출력합니다. 찾지 못하면 다른 요소를 대상의 구성 요소로 재정의 한 다음 찾을 때까지 찾을 수 있습니다.

암호:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
    
    
    int*arr = (int*)malloc(sizeof(int)*2);
    int temp = 0;
    *returnSize = 2;
    for(int i=0;i<numbersSize;i++)
    {
    
    
        temp = numbers[i];//选择的待定元素
        int left = i+1;
        int right = numbersSize-1;
        int mid ;
        while(left<=right)
        {
    
    
            mid = left+(right-left)/2;
            if(numbers[mid]>target-temp)
            {
    
    
                right = mid-1;//舍去,因为mid不符合
            }
            else if(numbers[mid]<target-temp)
            {
    
    
                left = mid+1;//同理
            }
            else if(numbers[mid]==target-temp)
            {
    
    
                arr[0] = i+1;
                arr[1] = mid+1;
                return arr;
            }
        }
    }
    return 1;
}

추천

출처blog.csdn.net/xiangguang_fight/article/details/115097229