国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【每日一題】數(shù)組中兩個數(shù)的最大異或值

這篇具有很好參考價值的文章主要介紹了【每日一題】數(shù)組中兩個數(shù)的最大異或值。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Tag

【哈希集合】【位運算-異或和】【數(shù)組】【2023-11-04】


題目來源

421. 數(shù)組中兩個數(shù)的最大異或值

【每日一題】數(shù)組中兩個數(shù)的最大異或值,LeetCode每日一題,哈希集合,位運算-異或,數(shù)組,2023-11-04

題目解讀

找出數(shù)組中兩個數(shù)的最大異或結(jié)果。


解題思路

一看數(shù)據(jù)量達(dá)到了 1 0 5 10^5 105,那時間復(fù)雜度為 O ( n 2 ) O(n^2) O(n2) 的方法必定超時,因此需要去找 O ( n l o g n ) O(nlogn) O(nlogn) 或者 O ( n ) O(n) O(n) 時間復(fù)雜度的方法。

對于本題,最直白的想法是枚舉數(shù)組中的兩個數(shù),計算異或值,找出最大值返回即可,但是該方法的需要兩次枚舉數(shù),屬于嵌套循環(huán),時間復(fù)雜度為 O ( n 2 ) O(n^2) O(n2),一定超時,故需要考慮其他方法。

接下來將介紹兩種方法來解決本題:

  • 哈希集合;
  • 字典樹(待完成…)。

方法一:哈希集合

以下思路與代碼主要參考 【圖解】簡潔高效,一圖秒懂?。≒ython/Java/C++/Go/JS/Rust)。

為了得到最大的異或和數(shù),簡稱為 結(jié)果,我們希望 結(jié)果 的二進(jìn)制數(shù)從高位到低位盡可能出現(xiàn)更多的 1。為什么對二進(jìn)制數(shù)進(jìn)行判斷?因為,位運算都是二進(jìn)制位之間的運算(異或和、按位與等等),我們對二進(jìn)制數(shù)進(jìn)行判斷會更加接近底層運算(異或和、按位與等等)。

跳出從數(shù)組中直接找數(shù)的固化思維,根據(jù) 結(jié)果 的特征,我們從最高位到最低位來找數(shù)。最高位也就是數(shù)組中最大數(shù)的二進(jìn)制數(shù)長度減一,我們從該位開始枚舉 i

  • 當(dāng)前需要找的結(jié)果是 newAns = res | (1 << i),也就是從數(shù)組中找到兩個數(shù)(低于 i 的比特位為 0)滿足這兩個數(shù)的異或和等于 newAns,如果有,則更新 res = newAns,否則 res 不變;
  • 判斷兩個數(shù)的異或和的解題思想是 兩數(shù)之和 哈希表解法。把代碼中的減法改成異或就行,這是因為如果 a ⊕ b = n e w A n s a\oplus b = newAns ab=newAns,那么兩邊同時異或 b,由于 b ⊕ b = 0 b\oplus b = 0 bb=0,所以得到 a = n e w A n s ⊕ b a = newAns \oplus b a=newAnsb。這樣就可以一邊枚舉 b,一邊在哈希表中查找 n e w A n s ⊕ b newAns \oplus b newAnsb 了。

實現(xiàn)代碼

class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        int mx = *max_element(nums.begin(), nums.end());
        int high_bit = mx ? 31 - __builtin_clz(mx) : -1;

        int res = 0, mask = 0;
        unordered_set<int> seen;
        for (int i = high_bit; i >= 0; --i) {
            seen.clear();
            mask |= (1 << i);
            int new_ans = res | (1 << i);
            for (int x : nums) {
                x &= mask;
                if (seen.contains(new_ans ^ x)) {
                    res = new_ans;
                    break;
                }
                seen.insert(x);
            }
        }
        return res;
    }
};

復(fù)雜度分析

時間復(fù)雜度: O ( n l o g U ) O(nlogU) O(nlogU), n n n 是數(shù)組 nums 的長度, U U U 是數(shù)組中最大元素的位數(shù)。

空間復(fù)雜度: O ( n ) O(n) O(n),哈希表中至多存放 n 個數(shù)。


其他語言

python3

class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        ans = mask = 0
        high_bit = max(nums).bit_length() - 1
        for i in range(high_bit, -1, -1):  # 從最高位開始枚舉
            mask |= 1 << i
            new_ans = ans | (1 << i)  # 這個比特位可以是 1 嗎?
            seen = set()
            for x in nums:
                x &= mask  # 低于 i 的比特位置為 0
                if new_ans ^ x in seen:
                    ans = new_ans  # 這個比特位可以是 1
                    break
                seen.add(x)
        return ans

寫在最后

如果文章內(nèi)容有任何錯誤或者您對文章有任何疑問,歡迎私信博主或者在評論區(qū)指出 ??????。

如果大家有更優(yōu)的時間、空間復(fù)雜度方法,歡迎評論區(qū)交流。

最后,感謝您的閱讀,如果感到有所收獲的話可以給博主點一個 ?? 哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-743705.html

到了這里,關(guān)于【每日一題】數(shù)組中兩個數(shù)的最大異或值的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 2023-08-13 LeetCode每日一題(合并兩個有序數(shù)組)

    2023-08-13 LeetCode每日一題(合并兩個有序數(shù)組)

    點擊跳轉(zhuǎn)到題目位置 給你兩個按 非遞減順序 排列的整數(shù)數(shù)組 nums1 和 nums2,另有兩個整數(shù) m 和 n ,分別表示 nums1 和 nums2 中的元素數(shù)目。 請你 合并 nums2 到 nums1 中,使合并后的數(shù)組同樣按 非遞減順序 排列。 **注意:**最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在數(shù)組 num

    2024年02月13日
    瀏覽(28)
  • 【LeetCode每日一題】410. 分割數(shù)組的最大值

    【LeetCode每日一題】410. 分割數(shù)組的最大值

    2024-1-21 410. 分割數(shù)組的最大值 思路:二分查找+貪心 利用二分查找法和貪心算法來求解將數(shù)組分割為m個非空連續(xù)子數(shù)組,使得每個子數(shù)組的和的最大值最小 首先,我們需要確定二分查找的左右邊界。左邊界 left 初始化為數(shù)組中的最大值,右邊界 right 初始化為數(shù)組所有元素的

    2024年01月23日
    瀏覽(25)
  • ( 數(shù)組和矩陣) 485. 最大連續(xù) 1 的個數(shù) ——【Leetcode每日一題】

    ( 數(shù)組和矩陣) 485. 最大連續(xù) 1 的個數(shù) ——【Leetcode每日一題】

    難度:簡單 給定一個二進(jìn)制數(shù)組 nums , 計算其中最大連續(xù) 1 的個數(shù)。 示例 1: 輸入:nums = [1,1,0,1,1,1] 輸出:3 解釋:開頭的兩位和最后的三位都是連續(xù) 1 ,所以最大連續(xù) 1 的個數(shù)是 3. 示例 2: 輸入:nums = [1,0,1,1,0,1] 輸出:2 提示: 1 = n u m s . l e n g t h = 1 0 5 1 = nums.length = 10^5

    2024年02月08日
    瀏覽(27)
  • 2023-09-05 LeetCode每日一題(從兩個數(shù)字?jǐn)?shù)組里生成最小數(shù)字)

    2023-09-05 LeetCode每日一題(從兩個數(shù)字?jǐn)?shù)組里生成最小數(shù)字)

    點擊跳轉(zhuǎn)到題目位置 給你兩個只包含 1 到 9 之間數(shù)字的數(shù)組 nums1 和 nums2 ,每個數(shù)組中的元素 互不相同 ,請你返回 最小 的數(shù)字,兩個數(shù)組都 至少 包含這個數(shù)字的某個數(shù)位。 示例 1: 示例 2: 提示: 1 = nums1.length, nums2.length = 9 1 = nums1[i], nums2[i] = 9 每個數(shù)組中,元素 互不相

    2024年02月09日
    瀏覽(29)
  • (動態(tài)規(guī)劃) 劍指 Offer 42. 連續(xù)子數(shù)組的最大和 ——【Leetcode每日一題】

    (動態(tài)規(guī)劃) 劍指 Offer 42. 連續(xù)子數(shù)組的最大和 ——【Leetcode每日一題】

    難度:簡單 輸入一個整型數(shù)組,數(shù)組中的一個或連續(xù)多個整數(shù)組成一個子數(shù)組。求所有子數(shù)組的和的最大值。 要求時間復(fù)雜度為 O(n) 。 示例1: 輸入: nums = [-2,1,-3,4,-1,2,1,-5,4] 輸出: 6 解釋: 連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6。 提示 : 1 = a r r . l e n g t h = 1 0 5 1 = arr.length = 10^

    2024年02月11日
    瀏覽(27)
  • C++字典樹算法:找出強(qiáng)數(shù)對的最大異或值 II

    C++字典樹算法:找出強(qiáng)數(shù)對的最大異或值 II

    數(shù)學(xué) 字典樹 給你一個下標(biāo)從 0 開始的整數(shù)數(shù)組 nums 。如果一對整數(shù) x 和 y 滿足以下條件,則稱其為 強(qiáng)數(shù)對 : |x - y| = min(x, y) 你需要從 nums 中選出兩個整數(shù),且滿足:這兩個整數(shù)可以形成一個強(qiáng)數(shù)對,并且它們的按位異或(XOR)值是在該數(shù)組所有強(qiáng)數(shù)對中的 最大值 。 返回數(shù)

    2024年02月05日
    瀏覽(95)
  • 【LeetCode每日一題】——85.最大矩形

    【LeetCode每日一題】——85.最大矩形

    矩陣 困難 85.最大矩形 給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進(jìn)制矩陣,找出只包含 1 的最大矩形,并返回其面積。 示例 1: 輸入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“

    2024年02月13日
    瀏覽(22)
  • 力扣每日一題88:合并兩個有序數(shù)組

    給你兩個按? 非遞減順序 ?排列的整數(shù)數(shù)組? nums1 ? 和? nums2 ,另有兩個整數(shù)? m ?和? n ?,分別表示? nums1 ?和? nums2 ?中的元素數(shù)目。 請你? 合并 ? nums2 ? 到? nums1 ?中,使合并后的數(shù)組同樣按? 非遞減順序 ?排列。 注意: 最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在

    2024年02月07日
    瀏覽(24)
  • C語言每日一題(22)合并兩個有序數(shù)組

    力扣網(wǎng) 88. 合并兩個有序數(shù)組 給你兩個按? 非遞減順序 ?排列的整數(shù)數(shù)組? nums1 ? 和? nums2 ,另有兩個整數(shù)? m ?和? n ?,分別表示? nums1 ?和? nums2 ?中的元素數(shù)目。 請你? 合并 ? nums2 ? 到? nums1 ?中,使合并后的數(shù)組同樣按? 非遞減順序 ?排列。 注意: 最終,合并后數(shù)組

    2024年02月08日
    瀏覽(32)
  • Leetcode-每日一題【1669.合并兩個鏈表】

    Leetcode-每日一題【1669.合并兩個鏈表】

    給你兩個鏈表?list1 和?list2?,它們包含的元素分別為?n 個和?m 個。 請你將?list1?中下標(biāo)從 a 到 b 的全部節(jié)點都刪除,并將list2?接在被刪除節(jié)點的位置。 下圖中藍(lán)色邊和節(jié)點展示了操作后的結(jié)果: ? 請你返回結(jié)果鏈表的頭指針。 示例 1: 輸入: list1 = [0,1,2,3,4,5], a = 3, b

    2024年02月13日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包