Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组
问题描述:
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
2 < = n u m b e r s . l e n g t h < = 3 ∗ 1 0 4 − 1000 < = n u m b e r s [ i ] < = 1000 n u m b e r s 按非递减顺序排列 − 1000 < = t a r g e t < = 1000 仅存在一个有效答案 2 <= numbers.length <= 3 * 10^4\\ -1000 <= numbers[i] <= 1000\\ numbers 按 非递减顺序 排列\\ -1000 <= target <= 1000\\ 仅存在一个有效答案 2<=numbers.length<=3∗104−1000<=numbers[i]<=1000numbers按非递减顺序排列−1000<=target<=1000仅存在一个有效答案
分析
第一个应该想到的就是暴力,时间复杂度 O ( N 2 ) O(N^2) O(N2).
暴力虽然时间复杂度高,但是绝对可以拿捏,不需要考虑其他特殊情况。
改进:
因为原数组是一个规律的有序数组,所以在找另一个数的时候,就可以二分了。时间复杂度 O ( N L o g N ) O(NLogN) O(NLogN).
特点:比较快,但是场景有限制,对编码能力有一定门槛。
再改进:
双指针,该方法还是基于有序数组,
- 从2个端点开始找,
- 如果 s u m = = t a r g e t sum==target sum==target,说明找到了一个合法的pair。
- 否则 s u m > t a r g e t sum>target sum>target,那就需要把右端点像左移。
- 如果 s u m < t a r g e t sum<target sum<target,那就需要把左端点向右移。
特点:这个比二分更快,时间复杂度 O ( N ) O(N) O(N),也是对场景有限制。
Two Sum 虽然简单,但是变种太多。如果不是有序的数组,这个时候,就不能直接使用二分和双指针了。
代码
二分
class Solution {
public int[] twoSum(int[] numbers, int target) {
int n = numbers.length;
for(int i = 0;i<n; i++){
int idx = find(numbers,i+1,n-1,target-numbers[i]);
if(idx!=-1){
return new int[]{i+1,idx+1};
}
}
return new int[0];
}
public int find(int[] arr,int l,int r,int tar){
int mid = 0;
while(l<=r){
mid = l+ (r-l)/2;
if(arr[mid]== tar) return mid;
if(arr[mid]>tar) r = mid-1;
else l = mid+1;
}
return -1;
}
}
时间复杂度 O ( N log N ) O(N\log N) O(NlogN)
空间复杂度 O ( 1 ) O(1) O(1)
双指针
class Solution {
public int[] twoSum(int[] numbers, int target) {
int l=0,r = numbers.length-1;
while(l<r){
int x = numbers[l]+numbers[r];
if(x== target){
return new int[]{l+1,r+1};
}
if(x>target) r--;
else l++;
}
return new int[0];
}
}
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
Tag
Array
Two pointer
文章来源:https://www.toymoban.com/news/detail-537678.html
Binary Search
文章来源地址https://www.toymoban.com/news/detail-537678.html
到了这里,关于【算法】Two Sum II - Input Array Is Sorted 两数之和 II - 输入有序数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!