问题描述:
给两个整数 n 和 k ,最终返回一个列表,该列表包含1-n的n个不同的整数,若列表arr=[a0,a1,...,an],则列表[|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|]包含k个不同的整数。
解法:
由题意可知,我们首先需要得到一个数组arr = [1,2,3,4,..,n],然后计算相邻数项之间的差。
假设n = 6,当k = 1时,如下图所示:
由此可见,当列表为正序排列时,相邻项之间的差值都为1,倒序同理。
当k = 2时,如下图所示:
当k = 3时,如下图所示:
当k = 4时,如下图所示:
当k = 5 时,如下图所示:
如上述说得,当偶数位从1开始正序排序,奇数位从n开始倒序排序,一共可以得到n-1个不同的整数。
若需要得到k个不同整数,则只需要要排列前k项,得到k - 1个不同的整数,然后再根据第k项的奇偶性排列剩下的差值为1的项。当第k项为奇数为时,从第k项的整数开始,进行降序排序,当第k项为偶数位时,从第k项的整数开始,进行升序排序。
代码如下:
class Solution {
public int[] constructArray(int n, int k) {
int[] arr = new int[n];
int last = n;//记录当前进行倒序排列时的整数
int first = 1;//记录当前进行正序排列时的整数
for(int i = 0;i < k;i++){//从列表第一位下标为0开始,到下标为k - 1结束,共排列了k位整数
if(i % 2 == 0){//如果当前位为偶数位则从first开始正序排列
arr[i] = first++;
}else{//如果当前位为奇数位则从last开始倒序排列
arr[i] = last--;
}
}
if((k - 1) % 2 == 0){//如果k-1位,即当前已排列的整数的最后一位为偶数位时
for(int i = k;i < n;i++){
arr[i] = first++;
}
}else{
for(int i = k;i < n;i++){
arr[i] = last--;
}
}
return arr;//返回目标所需数组
}
}
运行结果:
运行截图:(答案不唯一)
提交结果:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/beautiful-arrangement-ii