其实就是个窗口问题 left从1开始,right从2开始
left最多能到num/2的位置,right最多能到小于num的位置。
当前sum大于目标sum时,让left右移。
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(sum<3){
return result;
}
int left = 1;
int right = 2;
int curSum = left+right;
while(left<right && right<sum){
while(curSum>sum && left<sum/2){
curSum -= left;
left++;
}
if(curSum == sum){
result.add(getSequence(left,right));
}
right++;
curSum+=right;
}
return result;
}
public ArrayList<Integer> getSequence(int small , int big){
ArrayList<Integer> result = new ArrayList<>();
for(int i=small;i<=big;i++){
result.add(i);
}
return result;
}
}
第二题:求和为S的两个数字
乘积最小的,其实越靠外的越小。
初始放在leftindex=0 right=length-1处。
如果和小于sum,则left右移。如果大于sum,则right左移
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> result = new ArrayList<>();
if(array==null || array.length<=1){
return result;
}
int smallIndex = 0;
int largeIndex = array.length-1;
while(smallIndex<largeIndex){
if((array[smallIndex]+array[largeIndex])==sum){
result.add(array[smallIndex]);
result.add(array[largeIndex]);
//最外层的就是乘积最小的
break;
}
else if((array[smallIndex]+array[largeIndex])<sum){
smallIndex++;
}else{
largeIndex--;
}
}
return result;
}
}