陣列中數字出現的最大次數
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
限制:
2 <= nums <= 10000
由於題目中要求空間複雜度為o(1),那麼就不能考慮使用雜湊表之類的來儲存陣列中的元素了,這時有乙個奇妙的方法,就是利用異或的性質(不同返回1,相同返回0)。
首先我們考慮一下如果只有乙個數字出現了一次應該如何求解
如果題目中的陣列只有乙個數字出現了一次的話,我們考慮一下將整個陣列異或是什麼結果,因為相同的數字按位異或的話,各個位都會變為零,那麼最終肯定會出現零和只出現一次的數字進行異或,和零異或的結果還是原來的數字。所以我們只要將整個陣列進行異或就可以求得只出現一次的數字了。
我們考慮如何將兩個出現一次的數字分到兩個陣列中
如果我們能夠將兩個數字分別放到兩個陣列,那麼我們可以在兩個陣列中分別求出只出現一次的數字,放在一起就是題目的答案了,我們考慮按照兩個數字中的不同位進行分組,這樣可以保證答案的兩個數字會在不同的組內,而且原陣列內相同的數字必定所有位數都相同,那麼我們就能夠保證分組後兩個組內的其他元素也一定是相同的,這時,求解就變得簡單了
class
solution
return vector<
int>;}
};
時間複雜度o(n),空間複雜度o(1)。 每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...