小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】

2966 将数组划分为具有最大差值的数组

小白渣翻译:

给定一个大小为 n 的整数数组 nums 和一个正整数 k 。
将数组分成一个或多个大小为 3 的数组,满足以下条件:

  • nums 的每个元素都应该位于一个数组中。
  • 一个数组中任意两个元素之间的差异小于或等于 k 。

返回包含所有数组的二维数组。如果无法满足条件,则返回空数组。如果有多个答案,则返回其中任何一个。

例子

小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第1张图片
小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第2张图片

这里是小白理解

小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第3张图片
这时候坐在自习室的白月光居然也在看这道题,突然跑来问小白,这题是什么意思啊?

小白:这题目描述很诡异,而且他题目描述居然还多了两个限制,而且还是一个多维,那肯定得用到Arraylist来存储了,但是乍一看,确实不太懂他的意思。

这里我用大家能明白的在描述再描述一下:

就是不管数组nums有多长,但是要满足分配后的每一个小数组的大小是3。另外注意,这个小数组里边的差值 <= k的值。

当然了,作为绅士的小白,肯定是上图让白月光更好理解一下。
在这里插入图片描述

咱们先给上边的数组排个序
在这里插入图片描述
为了继续更好理解,在进行一个分割
小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第4张图片
小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第5张图片
黑长直OS:小伙子,可以啊,这不仅逻辑感人,美术功底也可以啊,有机会咱们去看看画展吧

真正面试环节

面试官:你可以解答这道”分割数组“的题目吗,看看小伙子你的二维数组处理能力。

小白:嘿嘿,这不巧了么这不是
小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第6张图片

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)了,下一面继续

小白水平理解面试经典题目_二维数组类LeetCode 2966 Divide Array【排序算法实现】_第7张图片
编码道路漫漫,只要先看脚下的路,徐徐前进即可。

你可能感兴趣的:(leetcode,面试,leetcode,排序算法)