题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出任意一对即可。
思路一:暴力破解。利用双重循环,以此扫描数组中的数字并求和,遇到和为S的便返回两个数字。时间复杂度为O(n^2);
思路二:利用快速排序的思想;
设置两个指针,指针P1从前向后遍历,第二个指针P2从后向前遍历;
- 当两个指针指向的数字和等于S时,返回P1,P2指向的数字
- 当两个指针指向的数字和小于S时,P1++;
- 当两个指针指向的数字和大于S时,P2--;
代码:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
//边界值判断
ArrayList<Integer> list=new ArrayList<Integer>();
if(array==null||array.length==0){
return list;
}
int ahead=0;
int behind=array.length-1;
int result=0;
while(ahead<behind){
result=array[ahead]+array[behind];
if(result==sum){
list.add(array[ahead]);
list.add(array[behind]);
return list;
}else if(result<sum){
ahead++;
}else{
behind--;
}
}
return list;
}
}
本文介绍了一种在已排序数组中寻找两数之和等于特定值S的有效算法。通过双指针策略,从前向后及从后向前遍历数组,实现O(n)的时间复杂度,显著优于传统暴力破解的O(n^2)复杂度。
1229

被折叠的 条评论
为什么被折叠?



