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][]);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值