算法day5

教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。

示例 1:

输入:actions = [1,2,3,4,5]
输出:[1,3,5,2,4] 
解释:为正确答案之一

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/7fwfti/
来源:力扣(LeetCode)
 

class Solution {

    public int[] trainingPlan(int[] actions) {

     //用双指针进行划分

     for(int i=0,j=actions.length-1;i<j;)

     {

         while(i<j&&actions[i]%2!=0)i++;

         while(i<j&&actions[j]%2==0)j--;

         int t=actions[i];

         actions[i]=actions[j];

         actions[j]=t;

     }

     return actions;

    }

}

solution2:

待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个 正整数(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组合列表。

注意,返回时需遵循以下规则:

每种组合按照文件编号 升序 排列;
不同组合按照第一个文件编号 升序 排列。
 

示例 1:

输入:target = 12
输出:[[3, 4, 5]]
解释:在上述示例中,存在一个连续正整数序列的和为 12,为 [3, 4, 5]。
示例 2:

输入:target = 18
输出:[[3,4,5,6],[5,6,7]]
解释:在上述示例中,存在两个连续正整数序列的和分别为 18,分别为 [3, 4, 5, 6] 和 [5, 6, 7]。

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/7fdcue/
来源:力扣(LeetCode)
 

class Solution {

    public int[][] fileCombination(int target) {

//最纯正的暴力解法哈哈

      int [][]a=new int[target/2][];

      int c=0;

      for(int i=1;i<=target/2;i++)

      {

          int sum=0;

          int j=i;

          int count=0;

         

          for(j=i;sum<target;j++)

          {count++;

            sum+=j;

          }

          if(sum==target){

                a[c]=new int[count];

                 int k=0;

                 j=i;

                while(count!=0)

                {

                  a[c][k++]=j++;

                  count--;

                }

                c++;

          }

      }

      int [][]res=new int[c][];

      for(int i=0;i<c;i++)

      {

          res[i]=new int[a[i].length];

      }

      for(int i=0;i<res.length;i++)

      {

          for(int j=0;j<res[i].length;j++)

          {

              res[i][j]=a[i][j];

          }

      }

      return res;

    }

}


 

 

class Solution {

    public int[][] fileCombination(int target) {

//法二数学分析法

     List<int []>list=new ArrayList();

     int i=1;

     double j=2.0;

     while(i<=target/2)

     {

        j = (-1 + Math.sqrt(1 + 4 * (2 * target + (long) i * i - i))) / 2;  //求根公式规定j为上界i为下界

        if(i<j&&j==(int)j){

           int []ans=new int[(int)j-i+1];

           int c=0;

           for(int k=i;k<=(int)j;k++)

           {

               ans[k-i]=k;

           }

           list.add(ans);

        }

        i++;

     }

     return list.toArray(new int[0][]);

    }

}

class Solution {

    public int[][] fileCombination(int target) {

   //法三滑动窗口

   List<int[]>res=new ArrayList();

   int i=1,j=2,s=3;

   while(i<j)

   {

        if(s == target) {

                int[] ans = new int[j - i + 1];

                for(int k = i; k <= j; k++)

                    ans[k - i] = k;

                res.add(ans);

            }


 

      if(s >= target) {

                s -= i;//先减在i++

                i++;

            }

       else {j++;   //这里要注意顺序先j++在s+=j

       s+=j;}

       

   }

     return res.toArray(new int[0][]);

    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值