我有一个整数数组的arraylist如下 -
27 14 62
15 92 15
16 40 90
61 23 78
23 70 90
25 93 98
我想找到所有最大尺寸的子集,以便
a1[0]<a2[0] && a1[1]<a2[1] && a1[2] <a2[2]
我做了什么 - 1)我按升序排列了arraylist的每一行。 2)然后我使用比较器对整个arraylist进行了排序 所以我明白了 -
14 27 62
15 85 92
16 40 90
23 61 78
23 70 90
25 93 98
但现在,我被困住了。我不知道如何根据上述约束找到所有最大尺寸的子集。 例如,在上面的例子中, -
14 27 62
15 85 92
25 93 98
14 27 62
23 61 78
25 93 98
14 27 62
23 70 90
25 93 98
是可能的最大尺寸子集。
答案 0 :(得分:1)
在检查约束之前是否真的允许对各个数组进行排序?以下算法应该以任何一种方式工作。
以下算法应该在O(n 2 )中找到一个最大集合(你需要全部吗?在这种情况下,最坏的情况是指数):
示例:
14 27 62
15 85 92
16 40 90
23 61 78
23 70 90
25 93 98
已经按照拓扑顺序排列。所以我们逐行计算:
14 27 62 -> 14 27 62
15 85 92 -> 14 27 62, 15 85 92
16 40 90 -> 14 27 62, 16 40 90
23 61 78 -> 14 27 62, 23 61 78
23 70 90 -> 14 27 62, 23 70 90
25 93 98 -> 14 27 62, 15 85 92, 25 93 98
答案 1 :(得分:1)
考虑这个算法:
row
,请开始跟踪subset
row2
row < row2
,则添加到子集,然后从步骤2递归继续subset
的大小与之前保存的子集进行比较:
尽管此算法的时间复杂度是指数级的,但它实现起来相当容易,对于较小的数据集可能已经足够了。
List<List<int[]>> findMaximumSubsets(int[][] arr) {
List<List<int[]>> acc = new ArrayList<>();
for (int i = 0; i < arr.length - 1; i++) {
findMaximumSubsets(arr, i, acc, new ArrayList<>(Collections.singletonList(arr[i])));
}
return acc;
}
void findMaximumSubsets(int[][] arr, int row, List<List<int[]>> acc, List<int[]> current) {
for (int i = row + 1; i < arr.length; i++) {
if (comparator.compare(arr[row], arr[i]) < 0) {
// ... (not spoiling for you ...)
}
}
}
Comparator<int[]> comparator = new Comparator<int[]>() {
@Override
public int compare(int[] a1, int[] a2) {
int cmp1 = Integer.compare(a1[0], a2[0]);
if (cmp1 > -1) {
return 0;
}
int cmp2 = Integer.compare(a1[1], a2[1]);
if (cmp2 > -1) {
return 0;
}
return Integer.compare(a1[2], a2[2]);
}
};