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%的测试过关率,不晓得是那个边界条件出错了。