1. 程式人生 > >LeetCode——只出現一次的數字

LeetCode——只出現一次的數字

感謝:只出現一次的數字 [ LeetCode ]

線性時間複雜度:時間複雜度最高為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];
    }

不符合題目要求的線性時間複雜度