思路:
- 乍一看这题应该是用全排列回溯做,但数据范围过大,可能是通过找规律来构建的,我们可以设想,奇数项从小到大排列,偶数项从大到小排列,这样的话相邻两数字的差就会依次递减小,而且这样排列,一定是可以使得不同整数的个数最多(n个数,最多构造n-1个不同的差值,相邻的数都不同)
- 题目说要构造k个不同的差值,我们可以先将1~n-k 个数构造成相同的差值(差值即为 1)
- 再将n-k+1到n 去构造 k个不同的差值 (包括差值为1 的)
class Solution {
public int[] constructArray(int n, int k) {
int[] arr= new int[n];
int index=0;
for(int i=1;i<=n-k-1;i++){
arr[index]=i;
index++;
}
int temp=index+1;
// n-k+1 ~ n
for (int i = n-k,j=n; i < n&& j > n-k; i++,j--) {
if(index<n){
arr[index]=i;
index+=2;
}
if (temp<n){
arr[temp]=j;
temp+=2;
}
}
return arr;
}
}