Problem
\136. Single Number
Easy
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
First Submit AC
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res, j;
for (int i = 0; i < nums.size(); i++)
{
for (j = 0; j < nums.size(); j++)
{
if (nums[i] == nums[j] && j != i)
{
break;
}
}
if (j == nums.size())
{
res = nums[i];
break;
}
}
return res;
}
};
算法时间复杂度:O(N2) 空间复杂度:O(1);
算法:对nums中每个数遍历,看是否重复,如果不重复,返回结果
时间复杂度的算法果然很好写,但是有用吗?加减乘除的练习确实很好做,但是没用呀?
你先在的瓶颈在算法,算法导论,开始学吧!发狂的学呀!算法导论,leetcode,如此嚣张,灭之!
![1557841202385](E:\Note in typora\Leetcode\Level 1\1557841202385.png)
这就是O(N) vs O(N2)
Online Way
- 用^(异或)的性质,奇偶校验本质上也是异或,也就是偶数个相同的数异或为0,奇数个异或为本身, 复杂度:T: O(N) S: O(1)
- 用hash表增删查O(1)的性质,有则删除,无则加入,最后返回唯一的元素
- 用set(hash)也行,无则加入
Improve Field
- stl库使用
Reduced Code
class Solution {
public:
/*int singleNumber(vector<int>& nums) {
int res, j;
for (int i = 0; i < nums.size(); i++)
{
for (j = 0; j < nums.size(); j++)
{
if (nums[i] == nums[j] && j != i)
{
break;
}
}
if (j == nums.size())
{
res = nums[i];
break;
}
}
return res;
}*/
/*int singleNumber(vector<int>& nums)
{
for (int i = 1; i < nums.size(); i++)
{
nums[0] ^= nums[i];
}
return nums[0];
}*/
/*int singleNumber(vector<int>& nums)
{
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++)
{
if (map.find(nums[i]) != map.end())
{
map.erase(nums[i]);
}
else map[nums[i]] = i;
}
auto iter = map.begin();
return iter->first;
}*/
int singleNumber(vector<int>& nums)
{
unordered_map<int, int> map;
int sum = 0;
for (int i = 0; i < nums.size(); i++)
{
if (map.find(nums[i]) == map.end())
{
map[nums[i]] = i;
}
sum += nums[i];
}
int subSum = 0;
for (auto iter = map.begin(); iter != map.end(); iter++)
{
subSum += iter->first;
}
return subSum * 2 - sum;
}
};
Tips Learning
unorder_map 有效的第一个元素,用begin()得到迭代器