题解 | #数值的整数次方#
和为S的两个数字
http://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b
//看了这么多题解,很少用二分的
//我这个二分每次是半边二分,但比双指针一格移动要快些
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
//二分:主要思想是怎么把区间缩短一半
/*
思路:
1)本题可以根据l + mid 来二分,也可以根据r + mid来二分
做二分题时,只使用其中一个条件来分割区间就行,否则情况太多了,脑子容易乱
2)也可以使用对撞双指针,不过每次只移动一格
*/
ArrayList<Integer> res = new ArrayList<Integer>();
if(array.length <= 0)
return res;
int l = 0;
int r = array.length - 1;
while(l + 1 < r){
int mid = l + (r - l) / 2;
if(array[l] + array[r] == sum){
res.add(array[l]);
res.add(array[r]);
return res;
}
if(array[mid] + array[r] < sum){
l = mid;
}else if(array[mid] + array[r] > sum){
r--;
}else{
res.add(array[mid]);
res.add(array[r]);
return res;
}
}
//判断剩余
if(array[l] + array[r] == sum){
res.add(array[l]);
res.add(array[r]);
return res;
}else
return res;
}
查看3道真题和解析