面试经典150题 day27
题目来源
力扣每日一题;题序:167
我的题解
方法一 哈希表
public int[] twoSum(int[] numbers, int target) {
Map<Integer,Integer> map=new HashMap<>();
int n=numbers.length;
for(int i=0;i<n;i++){
map.put(numbers[i],i+1);
}
for(int i=0;i<n;i++){
if(map.containsKey(target-numbers[i])){
return new int[]{i+1,map.get(target-numbers[i])};
}
}
return new int[]{-1,-1};
}
方法二 双指针
public int[] twoSum(int[] numbers, int target) {
int n=numbers.length;
if(n==2){
return new int[]{1,2};
}
int left=0,right=n-1;
while(left<right){
int t=numbers[left]+numbers[right];
if(t==target){
return new int[]{left+1,right+1};
}else if(t>target){
right--;
}else{
left++;
}
}
return new int[]{-1,-1};
}
方法三 双指针(二分查找优化)
public int[] twoSum(int[] numbers, int target) {
int left=0,right=numbers.length-1;
while(left<right){
int sum=numbers[left]+numbers[right];
int mid=left+((right-left)>>1);
if(sum==target)
return new int[]{left+1,right+1};
else if(numbers[left]+numbers[mid]>target)
right=mid-1;
else if(numbers[mid]+numbers[right]<target)
left=mid+1;
else if(sum>target)
right--;
else
left++;
}
return new int[]{-1,-1};
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~