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;
}