【问题标题】:Find if an array can form a graph查找数组是否可以形成图形
【发布时间】:2017-02-17 00:50:03
【问题描述】:

【面试题】我在最近的一次在线面试中得到了这个问题。我不知道如何解决它。谁能帮我解决这个问题,以便我可以学习Java。

汤姆非常善于解决问题。所以为了测试汤姆的技能,杰瑞问汤姆一个图形问题。杰瑞给汤姆一个包含 N 个整数的数组 A。

图是一个简单的图,当且仅当它没有自环或多重边。

现在杰瑞问汤姆他是否可以设计一个包含 N 个顶点的简单图。条件是 Tom 必须对图的顶点度数使用 A 的每个元素恰好一次。

现在,Tom 需要您的帮助来设计他的图表。如果可以设计图形,则打印“YES”,否则打印“NO”(不带引号)。

输入 第一行中的单个整数 T,表示测试用例的数量。 对于每个测试用例,有 2 行。 第一行是一个整数 N,表示数组 A 的元素个数。 第二行有 N 空间分隔的整数,表示 A 的元素。

输出 对于每个测试用例,在新行中打印“YES”或“NO”(不带引号)是否可以设计图形。

约束

1<= T <= 100 
1<= N <= 100 
0<= Element of A <= 5000

示例测试用例

输入

1
2
1 1

输出

YES

解释 对于这个测试用例,可以设计一个有 2 个顶点的简单图,其中每个顶点的度数为 1。

输入

2
3
1 2 1
3
1 1 1

输出

YES
NO

解释 对于第一个测试用例,我们可以设计一个简单的 3 个顶点图,其度数序列为 [1, 2, 1]。第一个顶点的度数为 1,第二个顶点的度数为 2,第三个顶点的度数为 1。 对于第二个测试用例,我们不能制作一个简单的3个顶点的图,其度数序列为[1,1,1]。

【问题讨论】:

  • 您的解释令人困惑,问题似乎没有得到很好的定义。您是说第三行是由空格分隔的元素,然后将第三行解释为顶点的度数。测试用例行是多余的,与问题陈述无关。

标签: java graph vertices


【解决方案1】:

一个必要条件是 A 中的元素之和是偶数。这是由于每个边缘 在邻接列表中被计算两次。

接下来是尝试构建图,或者至少“分配”节点对。

Sort elements of A in decending order,
Let the largest (first) element be a,
Check are element on positions 2 to a+1 larger than 0,
  If there is a element with value 0 than it is not possible to construct a graph,
Decrease these a elements by 1 and set first element to 0,
Repeat process until all elements are 0.

请注意,后续步骤中的排序可以使用合并排序步骤在 O(n) 中完成,因为列表包含 三个排序的部分:

  • 第一个元素 (0) 可以走到最后,
  • 带有元素的排序部分,
  • rest 也已排序。

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 2023-03-12
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多