0
点赞
收藏
分享

微信扫一扫

剑指 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 条评论