【leetcode每日一题】2022/9/8 667. 优美的排列 II
题目描述:
属于是一种思维题,想到了就非常简单,想不到就很难做出来,建议是先用例子找找规律,下面是找规律的思路。
以[1,2,3,4,5]为例
k=1时[1,2,3,4,5]本身就符合要求
k=2时 差值就确定为1,2 第一个数是1时,先处理差值2,第二个数就放3,
再处理差值1,第三个数可以放2,4和5保持不动,得到[1,3,2,4,5]
类似的 k=3时 处理顺序为3,2,1
第一个数为1,第二个数为1+3=4,第三个数为4-2=2,第四个数为2+1=3
得到[1,4,2,3,5]
k=4时 处理顺序为4,3,2,1
第一个数为1,第二个数为1+4=5,第三个数为5-3=2,第四个数为2+2=4
第五个数为4-1=3,得到[1,5,2,4,3]
找到这样的构造规律:
1.第一个数放1;
2.从k开始处理,一直k–到k=1;
3.+k和-k轮流交换
按照这个规律来完成代码:
class Solution {
public int[] constructArray(int n, int k) {
int[] answer = new int[n];
int index = 0;
answer[0] = 1;
Boolean flag = true;
while(k > 0){
index++;
if(flag)
answer[index] = answer[index-1]+k;
else
answer[index] = answer[index-1]-k;
flag = !flag;
k--;
}
for(int i = index+1; i < n; i++){
answer[i] = i+1;
}
return answer;
}
}
注意k比较小时,后续数组是需要再进行扩充的,但只需要用answer[i] = i+1;
来扩充即可。