教练使用整数数组 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][]);
}
}