剑指 Offer 57 - II. 和为s的连续正数序列

算法1:使用暴力算法

总结出来和最多只可能出现在target/2+target/2+1,所以循环的地方就是target/2+1

错误点:1.因为是个二维数组,所以有一点懵,总结就是可以使用list<int[]> 来定义二维数组,在最后的时候将其进行转换,list.toArray(new int[list.size()][])

class Solution {
    //这道题没有写出来的原因就是因为自己是暴力解法,所以由于害怕没有写出来
    public int[][] findContinuousSequence(int target) {
//这个算法主要考察 暴力算法的话主要考察二维数组
    int mid = target/2;
    List<int[]> list = new ArrayList<>();
    for(int i=1;i<=mid+1;i++){
      
      int sum = 0; 
      for(int j=i;j<=mid+1;j++){
          sum+=j;
          if(sum==target){
              //记录从开始的j到最后的j的位置
              int[] arr = new int[j-i+1];
              for(int k = i;k<=j;k++){
                  arr[k-i]=k;
              }
              list.add(arr);
              break;
          }
           if(sum>target){
              break;
          }
      }
      
    }
    // Integer[] array = new Integer[list.size()];
 
    // list.toArray(array);
    return list.toArray(new int[list.size()][]);
    }
}

第二种方法是滑动窗口的算法,滑动窗口的优势就是只需要遍历一次,所以本道题的可以只遍历一次,然后用左右指针的方式进行相加求和

class Solution {
    public int[][] findContinuousSequence(int target) {
        int pre = 1,cur =1;
        int sum =0;
        List<int[]> list = new ArrayList<>();
        while(pre<=target/2+1){
            sum+=cur;
            if(sum==target){
                //1.复制一下位置从pre到cur
                int[] arr = new int[cur-pre+1];
                for(int i=pre;i<=cur;i++){
                    
                     arr[i-pre] = i;
                }
                list.add(arr);
                //2.pre加一
                pre = pre+1;
                cur = pre;
                sum = 0;
            }else
            if(sum>target){
                pre =pre+1;
                cur = pre;
                sum = 0;
            }else{
                cur = cur+1;
            }
        }
        return list.toArray(new int [list.size()][]);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值