public static ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> doubleArray = new ArrayList<>();
int left = 0;
int right = 0;
//根据奇数还是偶数的不同,选择的左指针起点不一样
if(sum % 2 == 1){
left = sum / 2 + 1;
}else{
left = sum / 2;
}
//右指针肯定是从倒数第二个开始的,终止条件为right>0
right = left - 1;
while(right > 0){//例子15
//计算左指针到右指针的和,其实可以用公式的,没想到,(right + left)*(righr - left + 1)/2,连续数组的求和公式
int sumStartNum = sumStartNum(left, right);
if(sumStartNum == sum){
doubleArray.add(singleArrayList(left, right));
//8,7==>15,那么下一个肯定是7,6:循环一
left--;
right--;
}
else if(sumStartNum < sum){//由于7,6=13小于15,因此成7,6,5:543,5432,54321
right--;
}else if(sumStartNum > sum){//65,654,6543
left--;
}
}
return doubleArray;
}
public static ArrayList<Integer> singleArrayList(int left, int right){
ArrayList<Integer> singleArray = new ArrayList<>();
for (int i = right; i <= left; i++) {
singleArray.add(i);
}
return singleArray;
}
public static int sumStartNum(int left, int right){
int sum = 0;
for (int i = right; i <= left; i++) {
sum += i;
}
return sum;
}双指针滑窗法,居然自己想到了,哈哈。简单题飘了,不过之后50%的测试过关率,不晓得是那个边界条件出错了。



京公网安备 11010502036488号