题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可
分析:在数组中固定一个数字,再依次判断数组中其余n-1个数字与它的和是否为s,时间复杂度为O(n^2)。在数组中选择两个数字,如果它们的和等于s,我们即找到了这两个数字;如果和小于s,选择较小的数字后面的数字;如果和大于s,选择较大的数字后面的数字。时间复杂度O(n)
题目二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)
分析:可设置两个指针,分别指向序列的最小值low和最大值high,如果从low到high的和大于s,可以从序列中去掉最小值,即增大low;如果从low到high的和小于s,可以增大high,让序列包含更多的数字
题目三:牛客上对一进行了改进,即输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出乘积最小的两个数
import java.util.*;
public class wr41FindContinuousSequence {
// 题目一:查找两个数,和为s,若有多对,输出任意一对即可
// 方法一,固定,遍历,O(n^2)
public static ArrayList<Integer> findTwo(int []array,int sum){
ArrayList<Integer> list=new ArrayList<>();
for(int i=0;i<array.length;i++){
for(int j=i+1;j<array.length;j++){
if(array[i]+array[j]==sum){
list.add(array[i]);
list.add(array[j]);
break;
}
}
}
return list;
}
// 方法二,在数组中选择两个数字,计算其和,根据其和sum的关系,调整扫描策略
public static ArrayList<Integer> findTwoBetter(int []array,int sum){
ArrayList<Integer> list=new ArrayList<>();
int i=0;
int j=array.length-1;
while(i<j){
if(array[i]+array[j]==sum){
list.add(array[i]);
list.add(array[j]);
break;
}
else if(array[i]+array[j]>sum){
j--;
}
else{
i++;
}
}
return list;
}
// 题目二:和为s的连续正数序列
public static ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum){
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
int low=1;
int high=2;
while(low<high){
int curSum=(low+high)*(high-low+1)/2;
if(curSum==sum){
ArrayList<Integer> list=new ArrayList<>();
for(int i=low;i<=high;i++){
list.add(i);
}
result.add(list);
high++;
}
else if(curSum<sum){
high++;
}
else{
low++;
}
}
return result;
}
// 题目三:和为s的两个数,若有多对,输入乘积最小的
public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum){
ArrayList<Integer> list=new ArrayList<>();
int i=0;
int j=array.length-1;
while(i<j){
if(array[i]+array[j]==sum){
if(!list.isEmpty()){
int multi=list.get(0)*list.get(1);
int temp=array[i]*array[j];
if(temp<multi){
list.clear();
list.add(array[i]);
list.add(array[j]);
}
}
else{
list.add(array[i]);
list.add(array[j]);
}
i++;
}
else if(array[i]+array[j]>sum){
j--;
}
else{
i++;
}
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// int []array={1,2,4,7,11,15};
// ArrayList<Integer> list=findTwo(array,15);
// ArrayList<Integer> list=findTwoBetter(array,15);
// for(int i:list){
// System.out.print(i+" ");
// }
// System.out.println();
// ArrayList<ArrayList<Integer>> result=FindContinuousSequence(15);
// for(int i=0;i<result.size();i++){
// System.out.println(result.get(i));
// }
int []a={1,2,4,7,8,11,15};
ArrayList<Integer> listMin=FindNumbersWithSum(a,15);
for(int i:listMin){
System.out.print(i+" ");
}
}
}