题目地址:
https://www.lintcode.com/problem/top-three-numbers/description
给定一个数组,求其最大的三个数(要求三个数不同)。
思路是用TreeSet。开一个TreeSet,接着遍历数组。如果集合里数字个数小于 3 3 3个,则直接加进去;否则看一下新来的数是否比集合中最小的数要大,如果大,就加进去,接着看一下集合的数字个数是否增加了,如果增加了,说明新加的数是一个新数,就要把集合最小的数删掉;否则不动。代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
public class Solution {
/**
* @param arr: An array
* @return: Get the three largest numbers in the array
*/
public List<Integer> TopThree(List<Integer> arr) {
// write your code here
TreeSet<Integer> set = new TreeSet<>();
for (int n : arr) {
if (set.size() < 3) {
set.add(n);
} else {
if (n > set.first()) {
set.add(n);
if (set.size() > 3) {
set.remove(set.first());
}
}
}
}
List<Integer> res = new ArrayList<>(set);
// res是由小到大的,要翻转一下
Collections.reverse(res);
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。