leetcode-每日打卡

面试题57 - II. 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
一开始想着找规律,比如偶数的话序列长度一定是奇数个,但是发现奇数的没啥规律,只能放弃。暴力解时间超出,看了题解,发现可以优化。在右边指针移动的的判断除了小于1/2target外,还可以判断序列和与target大小,当序列和大于目标值后指针不再继续右移。而且左边指针右移时右指针也不用从头来,因为这一段数是上一个序列的子序列,而上一段序列是小于等于target的,所以这一段子序列一定小于target,直接右指针在原来的基础上右移就行。

class Solution {    public int[][] findContinuousSequence(int target) {        int mid=(target+1)/2;        int i=1,j=2,k=0,row=0;List<int[]>list1=new ArrayList<int[]>();        while(i<mid)        {            while(j<=mid&&(i+j)*(j-i+1)/2<=target)            {if((i+j)*(j-i+1)/2==target)            {                int []arr=new int[j-i+1];                for(k=i;k<=j;k++)            {                arr[row++]=k;            }            list1.add(arr);}            j++;            }            i++;            row=0;        }        int[][] temp=list1.toArray(new int [list1.size()][]);        return temp;    }}

这道题坑就坑在要数组输出,要先用list表示再转为数组,因为二维数组的声明至少第一个长度必须确定,第二个长度可以不用。所以在未知有多少子序列的情况下用列表,(一维数组的长度声明是就要确定)。可以申请一个数组列表,减少转换次数。
int [][]result=list.toArray(new int[len][]);

发布了45 篇原创文章 · 获赞 4 · 访问量 1054

猜你喜欢

转载自blog.csdn.net/weixin_43838915/article/details/104707275