Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.(给定一个整型数组,找出数组中是否含有任何副本元素,如果数组中出现两次以上的值则返回true,若数组元素值全是唯一的则返回false)
1.分析
数组处理问题,判断数组元素值是否全都唯一无重复。
2.个人解法
bool containsDuplicate(vector<int>& nums)
{
int numSize = nums.size();
vector<int>counter(numSize, 0);
int key;
for (int i=0; i<nums.size(); ++i)
{
key = nums[i] % numSize;
++counter[key];
if(counter[key] > 1)
return true;
}
return false;
}
该解法没有解决哈希表映射过程中冲突的问题,比如输入数组为[1,3]时,两个元素都映射到下标为1的位置上,导致结果判断为true。
3.参考解法
(1)
bool containsDuplicate(vector<int>& nums)
{
if(0 == nums.size())
return false;
sort(nums.begin(), nums.end());
for (int i=0; i<nums.size()-1; ++i)
{
if(nums[i] == nums[i+1])
return true;
}
return false;
}
该方法是先将原数组排序,然后再遍历,如果存在相同元素,则排序后的数组中肯定存在两个相邻元素相等。整个算法的时间复杂度为O(n*logn),空间复杂度为O(1)。
(2)
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>(nums.length);
for (int x: nums) {
if (set.contains(x)) return true;
set.add(x);
}
return false;
}
该解法是在Java中借助哈希表实现,可以看出该算法既高效又简洁,时间和空间复杂度都为O(n).
4.总结
虽然刚开始就想到用哈希表实现是最高效的方法,但在C++实现过程中却发现很难用哈希表实现,即使C++有map容器,但无法像Java一样可以自动创建键值对,不得不说Java的库丰富而易用。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- “个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。