// 使用哈希方法,用set 记录所有出现过的数字,如果没有冲突,则包含重复的元素。
// 事件复杂度为O(n),空间复杂度O(n)
class Solution { public: bool containsDuplicate(vector<int>& nums) { set<int>s; int len = nums.size(); for(int i=0;i<len;i++) { if(s.find(nums[i])==s.end()){ s.insert(nums[i]); }else{ return true; } } return false; } };
想用位图来做,但是超过了空间calloc 返回位nil
bool containsDuplicate(int* nums, int numsSize) { int n = 1; n = n<<(27); int *BitMap = (int *)calloc(n*sizeof(int)); printf("BitMap = %p ",BitMap); for(int i=0;i<numsSize;i++) { // 找出数字在位图中的坐标。(Block,表示哪一块int,bit表示32位 int中的哪一位) int temp = *(nums+i); int Block = temp/32; int bit = temp%32; printf("Block = %d ,bit = %d ",Block,bit); //根据坐标查找位图 int targetBlock = *(BitMap+Block); printf("targetBlock = %d ",targetBlock); int place = targetBlock &(1<<bit); if(place) { return false; }else { targetBlock = targetBlock |(1<<bit); *(BitMap+Block) = targetBlock; } } return true; }