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

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

這篇具有很好參考價值的文章主要介紹了代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

哈希表(散列表)理論基礎(chǔ) :哈希表是根據(jù)關(guān)鍵碼的值而直接進行訪問的數(shù)據(jù)結(jié)構(gòu)。
直白來講其實數(shù)組就是一張哈希表。
?
什么時候想到用哈希法, 當我們遇到了要快速判斷一個元素是否出現(xiàn)集合里的時候,就要考慮哈希法 。

當我們遇到了要快速判斷一個元素是否出現(xiàn)集合里的時候,就要考慮哈希法。

但是哈希法也是犧牲了空間換取了時間,因為我們要使用額外的數(shù)組,set或者是map來存放數(shù)據(jù),才能實現(xiàn)快速的查找。

如果在做面試題目的時候遇到需要判斷一個元素是否出現(xiàn)過的場景也應(yīng)該第一時間想到哈希法!

哈希函數(shù):將所求數(shù)據(jù)映射到哈希表上叫做哈希函數(shù)。
哈希函數(shù)如下圖所示,通過hashCode把名字轉(zhuǎn)化為數(shù)值,一般hashcode是通過特定編碼方式,可以將其他數(shù)據(jù)格式轉(zhuǎn)化為不同的數(shù)值,這樣就把學(xué)生名字映射為哈希表上的索引數(shù)字了。
代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

如果hashCode得到的數(shù)值大于 哈希表的大小了,也就是大于tableSize,為了保證映射出來的索引數(shù)值都落在哈希表上,我們會在再次對數(shù)值做一個取模的操作,就要我們就保證了學(xué)生姓名一定可以映射到哈希表上了。

此時問題又來了,哈希表我們剛剛說過,就是一個數(shù)組。

如果學(xué)生的數(shù)量大于哈希表的大小怎么辦,此時就算哈希函數(shù)計算的再均勻,也避免不了會有幾位學(xué)生的名字同時映射到哈希表 同一個索引下標的位置。

接下來會用到哈希碰撞

哈希碰撞

如圖所示,小李和小王都映射到了索引下標 1 的位置,這一現(xiàn)象叫做哈希碰撞

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

?哈希碰撞有兩解決辦法:拉鏈法和探測法。

1.拉鏈法;

剛剛小李和小王在索引1的位置發(fā)生了沖突,發(fā)生沖突的元素都被存儲在鏈表中。 這樣我們就可以通過索引找到小李和小王了。(數(shù)據(jù)規(guī)模是dataSize, 哈希表的大小為tableSize)

拉鏈法就是要選擇適當?shù)墓1淼拇笮。@樣既不會因為數(shù)組空值而浪費大量內(nèi)存,也不會因為鏈表太長而在查找上浪費太多時間。

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

?2.線性探測法

使用線性探測法,一定要保證tableSize大于dataSize。 我們需要依靠哈希表中的空位來解決碰撞問題。

例如沖突的位置,放了小李,那么就向下找一個空位放置小王的信息。所以要求tableSize一定要大于dataSize ,要不然哈希表上就沒有空置的位置來存放 沖突的數(shù)據(jù)了。

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

?常見的三種哈希結(jié)構(gòu):

1.數(shù)組

2.set(集合)

紅黑樹是一種平衡二叉搜索樹,所以key值是有序的,但key不可以修改,改動key值會導(dǎo)致整棵樹的錯亂,所以只能刪除和增加。

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

使用集合來解決哈希問題的時候,優(yōu)先使用unordered_set,因為它的查詢和增刪效率是最優(yōu)的,如果需要集合是有序的,那么就用set,如果要求不僅有序還要有重復(fù)數(shù)據(jù)的話,那么就用multiset。

3.map(映射)

代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

?在map 是一個key value 的數(shù)據(jù)結(jié)構(gòu),map中,對key是有限制,對value沒有限制的,因為key的存儲方式使用紅黑樹實現(xiàn)的。

雖然std::set、std::multiset 的底層實現(xiàn)是紅黑樹,不是哈希表,std::set、std::multiset 使用紅黑樹來索引和存儲,不過給我們的使用方式,還是哈希法的使用方式,即key和value。所以使用這些數(shù)據(jù)結(jié)構(gòu)來解決映射問題的方法,我們依然稱之為哈希法。 map也是一樣的道理。

LeetCode242.有效字母異位詞

題目鏈接:242. 有效的字母異位詞 - 力扣(LeetCode)??????

思路:

暴力解法:雙層for循環(huán),同時記錄字符重復(fù)出現(xiàn),時間復(fù)雜度為O(n*n)

哈希表解法:

定義一個數(shù)組叫做record(長度為26)用來上記錄字符串s里字符出現(xiàn)的次數(shù)。

需要把字符映射到數(shù)組也就是哈希表的索引下標上,因為字符a到字符z的ASCII是26個連續(xù)的數(shù)值,所以字符a映射為下標0,相應(yīng)的字符z映射為下標25。

再遍歷 字符串s的時候,只需要將 s[i] - ‘a(chǎn)’ 所在的元素做+1 操作即可,并不需要記住字符a的ASCII,只要求出一個相對數(shù)值就可以了。?這樣就將字符串s中字符出現(xiàn)的次數(shù),統(tǒng)計出來了。

那看一下如何檢查字符串t中是否出現(xiàn)了這些字符,同樣在遍歷字符串t的時候,對t中出現(xiàn)的字符映射哈希表索引上的數(shù)值再做-1的操作。

那么最后檢查一下,record數(shù)組如果有的元素不為零0,說明字符串s和t一定是誰多了字符或者誰少了字符,return false。

最后如果record數(shù)組所有元素都為零0,說明字符串s和t是字母異位詞,return true。

時間復(fù)雜度為O(n),空間上因為定義是的一個常量大小的輔助數(shù)組,所以空間復(fù)雜度為O(1)。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int hash[26] = {0};
        for(int i = 0;i < s.size();i++) {
            hash[s[i]-'a']++;
        }
        for(int i = 0;i < t.size();i++) {
            hash[t[i]-'a']--;
        }
        for(int i = 0;i < 26;i++) {
            if(hash[i] != 0) return false;
        }
        return true;
    }
};

LeetCode349. 兩個數(shù)組的交集

題目鏈接:349. 兩個數(shù)組的交集 - 力扣(LeetCode)

思路:

這道題目,主要要學(xué)會使用一種哈希數(shù)據(jù)結(jié)構(gòu):unordered_set,這個數(shù)據(jù)結(jié)構(gòu)可以解決很多類似的問題。

注意題目特意說明:輸出結(jié)果中的每個元素一定是唯一的,也就是說輸出的結(jié)果的去重的, 同時可以不考慮輸出結(jié)果的順序.

這道題用暴力的解法時間復(fù)雜度是O(n^2),那來看看使用哈希法進一步優(yōu)化。

注意:使用數(shù)組來做哈希的題目,是因為題目都限制了數(shù)值的大小。

而這道題目沒有限制數(shù)值的大小,就無法使用數(shù)組來做哈希表了。

而且如果哈希值比較少、特別分散、跨度非常大,使用數(shù)組就造成空間的極大浪費。

unorder_set做法:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums_set(nums1.begin(),nums1.end());
        for(int num:nums2) {
            if(nums_set.find(num)!=nums_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int> (result_set.begin(),result_set.end());
    }
};

數(shù)組做法:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; 
        int hash[1005] = {0};
        for(int i = 0;i < nums1.size();i++) {
            hash[nums1[i]] = 1;
        }
        for(int i = 0 ;i < nums2.size();i++) {
            if(hash[nums2[i]] == 1) {
                result_set.insert(nums2[i]);//往創(chuàng)建的unordered_set(result_set)添加數(shù)據(jù)
            }
        }
        return vector<int> (result_set.begin(),result_set.end());//返回result_set
    }
};

LeetCode 202.快樂數(shù)

題目鏈接:202. 快樂數(shù) - 力扣(LeetCode)

思路:

題目中說了會?無限循環(huán),那么也就是說求和的過程中,sum會重復(fù)出現(xiàn),這對解題很重要!

當我們遇到了要快速判斷一個元素是否出現(xiàn)集合里的時候,就要考慮哈希法了。

所以這道題目使用哈希法,來判斷這個sum是否重復(fù)出現(xiàn),如果重復(fù)了就是return false, 否則一直找到sum為1為止。

判斷sum是否重復(fù)出現(xiàn)就可以使用unordered_set。

還有一個難點就是求和的過程,如果對取數(shù)值各個位上的單數(shù)操作不熟悉的話,做這道題也會比較艱難。

class Solution {
public:
    //找出每個位的數(shù)字
    int getsum(int n) {
        int sum = 0;
        while(n != 0) {
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> set;
        while(true) {
            int a = getsum(n);
            //等于1時是快樂數(shù)
            if(a == 1) return true;
            //如果不是1的話繼續(xù)無限循環(huán)
            //如果每次遍歷時在set找到了任意一個sum重復(fù)出現(xiàn),就是無限循環(huán)
            if(set.find(a) != set.end()) {
                return false;
            }
            //如果沒找到,將該sum添加set
            else set.insert(a);
            //每次循環(huán)前將sum值賦值給a
            n = a;
        }
    }
};

LeetCode1.兩數(shù)之和

題目鏈接:1. 兩數(shù)之和 - 力扣(LeetCode)

思路:

首先我在強調(diào)一下?什么時候使用哈希法,當我們需要查詢一個元素是否出現(xiàn)過,或者一個元素是否在集合里的時候,就要第一時間想到哈希法。

本題呢,我就需要一個集合來存放我們遍歷過的元素,然后在遍歷數(shù)組的時候去詢問這個集合,某元素是否遍歷過,也就是 是否出現(xiàn)在這個集合,也應(yīng)該用哈希法。

因為本題,我們不僅要知道元素有沒有遍歷過,還要知道這個元素對應(yīng)的下標,需要使用 key value結(jié)構(gòu)來存放,key來存元素,value來存下標,那么使用map正合適。

再來看一下使用數(shù)組和set來做哈希法的局限。

  • 數(shù)組的大小是受限制的,而且如果元素很少,而哈希值太大會造成內(nèi)存空間的浪費。
  • set是一個集合,里面放的元素只能是一個key,而兩數(shù)之和這道題目,不僅要判斷y是否存在而且還要記錄y的下標位置,因為要返回x 和 y的下標。所以set 也不能用。

此時就要選擇另一種數(shù)據(jù)結(jié)構(gòu):map ,map是一種key value的存儲結(jié)構(gòu),可以用key保存數(shù)值,用value在保存數(shù)值所在的下標。

  • map用來做什么
  • map中key和value分別表示什么

map目的用來存放我們訪問過的元素,因為遍歷數(shù)組的時候,需要記錄我們之前遍歷過哪些元素和對應(yīng)的下標,這樣才能找到與當前元素相匹配的(也就是相加等于target)

接下來是map中key和value分別表示什么。

這道題 我們需要 給出一個元素,判斷這個元素是否出現(xiàn)過,如果出現(xiàn)過,返回這個元素的下標。

那么判斷元素是否出現(xiàn),這個元素就要作為key,所以數(shù)組中的元素作為key,有key對應(yīng)的就是value,value用來存下標。

所以 map中的存儲結(jié)構(gòu)為 {key:數(shù)據(jù)元素,value:數(shù)組元素對應(yīng)的下標}。

在遍歷數(shù)組的時候,只需要向map去查詢是否有和目前遍歷元素匹配的數(shù)值,如果有,就找到的匹配對,如果沒有,就把目前遍歷的元素放進map中,因為map存放的就是我們訪問過的元素。文章來源地址http://www.zghlxwxcb.cn/news/detail-497800.html

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        for(int i = 0; i < nums.size();i++) {
            //遍歷當前元素,并在map中尋找匹配的key
            auto iter = map.find(target - nums[i]);
            //當map最后一個數(shù)不等于iter時,返回第i個元素的值
            if(iter != map.end()) {
                return {iter->second,i};
            }
            //插入數(shù)組的數(shù)字和序列到map做key和value
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

到了這里,關(guān)于代碼隨想錄第6天| 哈希表理論基礎(chǔ) ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【代碼隨想錄 | Leetcode | 第十天】哈希表 | 三數(shù)之和 | 四數(shù)之和

    【代碼隨想錄 | Leetcode | 第十天】哈希表 | 三數(shù)之和 | 四數(shù)之和

    歡迎來到小K的Leetcode|代碼隨想錄|專題化專欄,今天將為大家?guī)砉7▇三數(shù)之和 | 四數(shù)之和的分享 ? ?題目鏈接點這里 給你一個整數(shù)數(shù)組 nums ,判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i != j、i != k 且 j != k ,同時還滿足 nums[i] + nums[j] + nums[k] == 0 。請你返回所有和為

    2024年02月15日
    瀏覽(50)
  • 【代碼隨想錄 | Leetcode | 第九天】哈希表 | 快樂數(shù) | 四數(shù)相加 II | 贖金信

    【代碼隨想錄 | Leetcode | 第九天】哈希表 | 快樂數(shù) | 四數(shù)相加 II | 贖金信

    歡迎來到小K的Leetcode|代碼隨想錄|專題化專欄,今天將為大家?guī)砉7▇快樂數(shù) | 四數(shù)相加 II | 贖金信的分享 ? ?題目鏈接點這里 編寫一個算法來判斷一個數(shù) n 是不是快樂數(shù)。 「快樂數(shù)」 定義為: 對于一個正整數(shù),每一次將該數(shù)替換為它每個位置上的數(shù)字的平方和。 然后

    2024年02月13日
    瀏覽(49)
  • 代碼隨想錄刷題第6天|哈希表 LeetCode242、LeetCode349、LeetCode202、LeetCode1

    1、LeetCode242 有效的字母異位詞 題目鏈接:242、有效的字母異位詞 用哈希表,record[s[i]-\\\'a\\\']++,record[t[i]-\\\'a\\\']--,最后判斷record里是否有元素不為0。 2、LeetCode349、兩個數(shù)組的交集 題目鏈接:349、兩個數(shù)組的交集 題目如果沒有限制數(shù)值的大小,就無法使用數(shù)組來做哈希表。如果哈

    2024年02月06日
    瀏覽(24)
  • 代碼隨想錄第44天|動態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄第44天|動態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄 (programmercarl.com) 動態(tài)規(guī)劃之完全背包,裝滿背包有多少種方法?組合與排列有講究!| LeetCode:518.零錢兌換II_嗶哩嗶哩_bilibili 完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 完全背包中的物品可以添加多次,所以要從小到大遍歷: 518. 零錢兌換

    2024年04月25日
    瀏覽(26)
  • 代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計鏈表、翻轉(zhuǎn)鏈表

    代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計鏈表、翻轉(zhuǎn)鏈表

    1、基本類型:單鏈表、雙鏈表、循環(huán)鏈表 2、存儲方式:和數(shù)組不一樣,鏈表是隨機存儲在內(nèi)存中,不是連續(xù)分配在內(nèi)存中。 3、鏈表的定義: 定義了一個數(shù)據(jù)域,還有一個指針域,并且定義了一個構(gòu)造函數(shù)。 4、鏈表的操作: 刪除節(jié)點: ?在圖中,若需要刪除D這個節(jié)點,只

    2024年02月05日
    瀏覽(29)
  • 代碼隨想錄Day3|鏈表理論基礎(chǔ)|203.移除鏈表元素|707.設(shè)計鏈表|206.反轉(zhuǎn)鏈表

    雖然以前寫過一次鏈表,但是真的已經(jīng)忘得一干二凈了 鏈表 :通過 指針 串聯(lián)在一起的線性結(jié)構(gòu),每個 節(jié)點 都由數(shù)據(jù)域和指針域組成。 指針域 :存放下一個節(jié)點的指針,最后一個節(jié)點的指針域指向null,也即空指針 head :鏈表的入口節(jié)點,也即鏈表的頭節(jié)點 鏈表的類型 單

    2024年02月11日
    瀏覽(22)
  • 代碼隨想錄 -- 哈希表--兩數(shù)之和

    力扣hot1:兩數(shù)之和 給定一個整數(shù)數(shù)組 nums?和一個目標值 target,請你在該數(shù)組中找出和為目標值的那?兩個?整數(shù),并返回他們的數(shù)組下標。 你可以假設(shè)每種輸入只會對應(yīng)一個答案。但是,數(shù)組中同一個元素不能使用兩遍。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] +

    2024年02月09日
    瀏覽(19)
  • 第10天-代碼隨想錄刷題訓(xùn)練-第五章 棧和隊列- ● 理論基礎(chǔ) ● 232.用棧實現(xiàn)隊列 ● 225. 用隊列實現(xiàn)棧

    第10天-代碼隨想錄刷題訓(xùn)練-第五章 棧和隊列- ● 理論基礎(chǔ) ● 232.用棧實現(xiàn)隊列 ● 225. 用隊列實現(xiàn)棧

    棧和隊列對應(yīng)的三個不同的STL版本,底層實現(xiàn)方式不一樣, 為我們所知道的是 SGI STL 棧 棧提供 pop和push等接口, 不提供走訪功能 也不提供迭代器, 不像map和set可以使用迭代器遍歷,往往不被歸類為容器,而是容器適配器 棧的內(nèi)部實現(xiàn)結(jié)構(gòu)可以使用 verctor、list 和 deque(默認)

    2024年02月04日
    瀏覽(29)
  • 【代碼隨想錄-哈希表】有效的字母異位詞

    【代碼隨想錄-哈希表】有效的字母異位詞

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月21日
    瀏覽(96)
  • Day7代碼隨想錄(1刷) 哈希表

    Day7代碼隨想錄(1刷) 哈希表

    目錄 454. 四數(shù)相加 II ?383. 贖金信 15. 三數(shù)之和 ?18. 四數(shù)之和 ? 給你四個整數(shù)數(shù)組? nums1 、 nums2 、 nums3 ?和? nums4 ?,數(shù)組長度都是? n ?,請你計算有多少個元組? (i, j, k, l) ?能滿足: 0 = i, j, k, l n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 示例 1: 示例 2: ?? 提示: n == nums1.l

    2024年03月25日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包