一、Problem
牛牛有一个数组长度大小为 n,数组中有 n 个正整数。现在牛牛请你从其中选出三个元素(注意选择元素的下标不能相同,但是其值可以相同)组成一个三角形。
无法做到,请输出一行一个字符串 “No solution”,反之请输出这三个元素的值。
如果有多种组成三角形的元素组合,你可以输出任意一种
输入描述:
第一行是一个正整数 表示数组的元素个数。
接下来一行输入n个正整数 表示每个数组元素的值。
输出描述:
如无法做到,请输出一行一个字符串 “No solution”,反之请输出这三个元素的值。
如果有多种组成三角形的元素组合,你可以输出任意一种。
5
2 2 3 2 2
2 2 3
二、Solution
方法一:dfs
选够了就检查是否可以组成三角形…
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
static class Solution {
int n, a[];
boolean done;
List<Integer> all = new ArrayList<>(3), res;
boolean check() {
int a = all.get(0), b = all.get(1), c = all.get(2);
if (a+b <= c || a + c <= b || b + c <= a) return false;
if (a-b >= c || a - c >= b || b - c >= a) return false;
return true;
}
void dfs(int idx) {
if (done) return;
if (all.size() == 3) {
if (check()) {
done = true;
res = new ArrayList(all);
}
return;
}
for (int i = idx; i < n; i++) {
all.add(a[i]);
dfs(i+1);
all.remove(all.size()-1);
}
}
void init() {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
a = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();
dfs(0);
if (res == null) System.out.println("No solution");
else for (int i = 0; i < res.size(); i++)
System.out.print(res.get(i) + " ");
}
}
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
复杂度分析
- 时间复杂度:,
- 空间复杂度:,