題目描述
輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們的和正好是s,如果有多對數字的和等於s,輸出任意一對即可。
解題思路
- 一般思路,定位一個數據,再找另一個求和直到等於S。時間複雜度O(n^)
- 高效方法:時間複雜度O(n)
- 定義兩個指針分別指向數組首位
- 如果當前之和大於S,則前移尾指針
- 如果當前之和小於S,則後移頭指針
算法圖解
參考代碼:
package offer;
/**
* 和爲s的數字
* 輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們的和正好是s,如果有多對數字的和等於s,輸出任意一對即可。
*/
public class Offer57 {
public static void main(String[] args) {
int nums[] = {1, 2, 4, 7, 11, 15};
findNumberWithSum(nums, 15);
}
static void findNumberWithSum(int nums[], int s) {
if (nums == null || s <= 0 || nums.length < 1) {
return;
}
int small = 0;
int big = nums.length - 1;
while (small < big) {
int sum = nums[small] + nums[big];
if(sum<s){
small++;
}
if(sum>s){
big--;
}
sum=nums[small]+nums[big];
if(sum==s){
System.out.println(nums[small]+"-"+nums[big]);
break;
}
}
}
}
附錄
該題源碼在我的 ?Github 上面!