2966 将数组划分为具有最大差值的数组
小白渣翻译:
给定一个大小为 n 的整数数组 nums 和一个正整数 k 。
将数组分成一个或多个大小为 3 的数组,满足以下条件:
- nums 的每个元素都应该位于一个数组中。
- 一个数组中任意两个元素之间的差异小于或等于 k 。
返回包含所有数组的二维数组。如果无法满足条件,则返回空数组。如果有多个答案,则返回其中任何一个。
例子
这里是小白理解
这时候坐在自习室的白月光居然也在看这道题,突然跑来问小白,这题是什么意思啊?
小白:这题目描述很诡异,而且他题目描述居然还多了两个限制,而且还是一个多维,那肯定得用到Arraylist来存储了,但是乍一看,确实不太懂他的意思。
这里我用大家能明白的在描述再描述一下:
就是不管数组nums有多长,但是要满足分配后的每一个小数组的大小是3。另外注意,这个小数组里边的差值 <= k的值。
当然了,作为绅士的小白,肯定是上图让白月光更好理解一下。
咱们先给上边的数组排个序
为了继续更好理解,在进行一个分割
黑长直OS:小伙子,可以啊,这不仅逻辑感人,美术功底也可以啊,有机会咱们去看看画展吧
真正面试环节
面试官:你可以解答这道”分割数组“的题目吗,看看小伙子你的二维数组处理能力。
小白:嘿嘿,这不巧了么这不是
public int[][] divideArray(int[] nums, int k) {
Arrays.sort(nums);
int[][] ans = new int[nums.length / 3][3];
for (int i = 0; i < nums.length; i += 3) {
if (nums[i + 2] - nums[i] > k) {
return new int[0][0];
}
ans[i / 3] = new int[]{nums[i], nums[i + 1], nums[i + 2]};
}
return ans;
}
好了,时间复杂度O(nlogN)了,下一面继续
编码道路漫漫,只要先看脚下的路,徐徐前进即可。