和为S的连续整数序列
题目描述
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路
定义两个指针,分别递增,寻找和为s的序列。
注意:初始化small=1,big=2;small到big序列和小于sum,big++;大于sum,small++;
终止条件是:当small增加到(1+sum)/2是停止
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
//题目要求至少两个数
if(sum < 3) return res;
int small = 1;
int big = 2;
//注意终止条件是small!=(1+sum)/2
while(small != (1+sum)/2){
int count = sumCount(small,big);
if(count == sum){
for(int i = small;i<=big;i++){
list.add(i);
}
res.add(new ArrayList<>(list));//注意这里一定要新建一个list对象进行添加,因为java是值传递,这里传递的是地址,下面的list.clear()就会将list里面的值全删除掉
list.clear();
big++;//这一步非常重要,不然程序无法继续进行
}else if(count < sum){
big++;
}else{
small++;
}
}
return res;
}
public int sumCount(int small,int big){
int count = 0;
for(int i = small;i<=big;i++){
count+=i;
}
return count;
}
}
和为s的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出
思路
不停地向后遍历,见代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<>();
int min = Integer.MAX_VALUE;//非常重要
//list.add(array[0]);
//list.add(array[1]);
for(int i = 0;i < array.length-1;i++){
for(int j = i+1;j < array.length;j++){
int count = array[i]+array[j];
if(count == sum){
int mul = array[i] * array[j];
if(min > mul){
min = mul;//别忘了改变min值,方便后续判断
list.clear();
list.add(array[i]);
list.add(array[j]);
}
}
}
}
return list;
}
}