好家伙,怎么出题的,比 Two Sum I 还要简单
JAVA
双指针 + 二分法
class Solution {
public int[] twoSum(int[] numbers, int target) {
int i = 0, j = numbers.length - 1;
while (i < j) {
int m = (i + j) >> 1;
if (numbers[i] + numbers[m] > target) {
j = m - 1;
} else if (numbers[m] + numbers[j] < target) {
i = m + 1;
} else if (numbers[i] + numbers[j] > target) {
j--;
} else if (numbers[i] + numbers[j] < target) {
i++;
} else {
return new int[]{i + 1, j + 1};
}
}
return new int[]{0, 0};
}
}
while 循环中先用二分法,再用双指针,二分法用于大范围搜索,双指针用于小范围搜索
Python
双指针 + 二分法
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i, j = 0, len(numbers)-1
while(i < j):
m = (i+j) >> 1
if numbers[i]+numbers[m] > target:
j = m-1
elif numbers[m]+numbers[j] < target:
i = m+1
elif numbers[i]+numbers[j] < target:
i += 1
elif numbers[i]+numbers[j] > target:
j -= 1
else:
return [i+1, j+1]
return [0, 0]