目录
题目一
题目描述
和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
测试用例
- 功能测试(数组中存在和为s的两个数;数组中不存在和为s的两个数)
- 特殊输入测试(表示数组的指针为空指针)
解题思路
充分利用数组是递增排序的性质,使用双指针,详细见书上表格
- 定义两个指针,一个指向数组的第一个数字,一个指向数组的最后一个数字
- 如果两个指针指向的数字加起来等于数字s,则返回结果
- 如果两个指针指向的数字加起来大于数字s,则指向数组后面数字的指针左移
- 如果两个指针指向的数字加起来小于数字s,则指向数组前面数字的指针右移
时间复杂度为O(n)
参考解题
import java.util.ArrayList;
public class Solution {
// 递增排序数组
// 双指针
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> result = new ArrayList<Integer>();
int length = array.length;
// 异常
if(array == null || array.length < 1){
return result;
}
// ---按照表格规律书写逻辑----
int small = 0;
int big = length - 1;
int MinProduct = array[length - 1] * array[length - 2];// 最小乘积初始为最大值
while(small < big){
// 一个循环,时间复杂度o(n)
int curSum = array[small] + array[big];
if(curSum == sum && ((array[small] * array[big]) < MinProduct)){
// 当前array[small] 、 array[big]为一对结果
MinProduct = array[small] * array[big];
result.clear();
result.add(array[small]);
result.add(array[big]);
}else if(curSum > sum){
big--;
}else {
small++;
}
}
return result;
}
}
清空ArrayList
1、ArrayList.clear()
方法,时间复杂度O(n)
2、ArrayList.removeAll()
方法,时间复杂度O(n^2)
与removeAll()
方法相比,clear()
方法提供了更好的性能。
https://geek-docs.com/java/java-collection/how-to-empty-an-arraylist.html
题目二
题目描述
和为s的连续正数序列
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数),例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所有打印出3个连续序列15、46和7~8
测试用例
- 功能测试(存在和为s的连续序列,如9、100等;不存在和为s的连续序列,如0,4等)。
- 边界值测试(连续序列的最小和3)
解题思路
- 定义连续正数序列的首尾节点small、big;small初始化为1,big初始化为2
- 如果序列和等于s,则将序列输出,并改变big值,进入新一轮的查找
- 如果序列和大于s,从序列中去掉最小的值,增大small的值,small的值最多加到s/2
- 如果序列和小于s,big加1,然后加入到序列中
参考解题
import java.util.ArrayList;
public class Solution {
//和为num的连续整数序列
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >();
// 异常
if(sum < 3){
return result;
}
//
int small = 1;
int big = 2;
int mid = (1 + sum)/2;
int curSum = small + big;
while(small < mid && small < big){
// 循环条件,小技巧
if(curSum == sum){
// 保存当前序列
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = small; i <= big; ++i ){
list.add(i);
}
result.add(list);
big++;
curSum += big;
}else if(curSum > sum ){
curSum -= small;
// small 右移
small++;
}else{
// big右移
big++;
curSum += big;
}
}
return result;
}
}