这道题挺容易的。主要是排序+哈希。题目里有明显的去重的意思,所以哈希set是肯定有的。找最大最小,最方便的就是排序。这里我为了操作方便,把数组nums拷贝到了集合list里面。排一次序,之后取最大值最小值都很方便。
Collections.sort()方法,可以给Collection集合排序。
我的答案是这样:
class Solution {
Set<Double> set = new HashSet<Double>();
public int distinctAverages(int[] nums) {
int nlen = nums.length;
List<Integer> list = new LinkedList<>();
for (int i = 0; i < nlen; i++) {
list.add(nums[i]);
}
int max;
int min;
double avg;
Collections.sort(list);
while(list.size() > 0) {
max = list.get(list.size() - 1);
min = list.get(0);
list.remove(list.size()-1);
list.remove(0);
avg = (max+min)*1.0/2;
set.add(avg);
}
return set.size();
}
}
看了题解,发现自己的思路还有很大的优化空间。题解结合了双指针,以及所谓的删除也没必要真的删去,用双指针维护一段有效区间即可。avg也没必要切切实实求出来,因为题干要求的是求不同平均值的数目,数目从set的长度就可以体现。因此,如果两数的和相同平均值就会相同,没必要把平均值的具体答案求出。
这样算法的效率大大提升。
class Solution {
public int distinctAverages(int[] nums) {
Arrays.sort(nums);
Set<Integer> seen = new HashSet<Integer>();
for (int i = 0, j = nums.length - 1; i < j; ++i, --j) {
seen.add(nums[i] + nums[j]);
}
return seen.size();
}
}