LeetCode——只出現一次的數字
阿新 • • 發佈:2018-12-30
線性時間複雜度:時間複雜度最高為O(n)
不使用額外空間:空間複雜度最高為O(1)
方法一:異或法(所有數字在二進位制下相與結果為落單的數字)
int singleNumber(vector<int>& nums) { int num = 0; for (int i = 0; i < nums.size(); i++) { num = num ^ nums[i]; } return num; }
方法二:(使用STL中set,當二次插入時set返回型別(pair)中提取false,刪除set中元素。最後將只剩落單元素)
int singleNumber(vector<int>& nums) { set<int> has; for (int i = 0; i < nums.size(); i++) { bool bo = has.insert(nums[i]).second; //返回pair型別 if (bo == false) { has.erase(nums[i]); } } for(auto m : has) return m; }
利用了HashSet集合不可重複的特性,其實HashSet的底層是通過HashMap來實現的。呼叫的 resize() 、 putTreeVal() 等方法本身也是O(n2)的時間複雜度。不符合題目要求的線性時間複雜度。
方法三:(重新排序)
int singleNumber(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]; }
不符合題目要求的線性時間複雜度。