初级-数组
004:存在重复元素
给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
//way1:两次遍历(超时)
bool containsDuplicate1(vector<int>& nums)
{
int flag = 0;
for(int i=0; i<nums.size(); i++)
{
for(int j=i+1; j<nums.size(); j++)
{
if(nums[i]==nums[j]) flag = 1;
}
}
if(flag==1) return true;
else return false;
}
//way2:先排序后判断(16ms, 15.1MB)
bool containsDuplicate2(vector<int>& nums)
{
sort(nums.begin(), nums.end());
for(int i=0; i<nums.size()-1; i++)
if(nums[i]==nums[i+1]) return true;
return false;
}
//way3:利用集合set性质(44ms, 22MB)
bool containsDuplicate3(vector<int>& nums)
{
set<int> s;
for(auto num : nums) s.insert(num);
if(s.size()!=nums.size()) return true;
return false;
}
005:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。
你可以不使用额外空间来实现吗?
//way1:先排序,再前后对比(?失败)
int singleNumber1(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int before_dif = 0;
for(int i=0; i<nums.size()-1; i++)
{
//if(i==nums.size()-2 && nums[i]!=nums[i+1])
if(i==nums.size()-2 && nums[i]!=nums[i+1]) return nums[i+1];
if(nums[i]!=nums[i+1] && before_dif==1) return nums[i];
if(nums[i]!=nums[i+1] && before_dif==0) before_dif = 1;
else if(nums[i]==nums[i+1] && before_dif==1) before_dif = 0;
}
return 0;
}
//way2:异或方法(12ms, 16.5MB)
//异或:[位运算]相异为真,相同为假-a^a=0, 0^a=a^0=a; 交换律:a^b^a=a^a^b=b
int singleNumber2(vector<int>& nums)
{
int reduce = 0;
for(auto num : nums)
reduce ^= num;
return reduce;
}
//way3:奇数位判断法(24ms, 16.5MB)
int singleNumber3(vector<int>& nums)
{
sort(nums.begin(), nums.end());
for(int i=0; i<nums.size()-1; i+=2)
if(nums[i]!=nums[i+1]) return nums[i];
return nums[nums.size()-1];
}