一點刷LeetCode題的感想

LeetCode 題集感想

Q1.Two Sum

題目:給定一個數組{2,3,5,7},以及一個目標值target,要求找出兩個能使為target的集合元素的下標,并按下標小的在前排序出來。

思路:

方法1. 使用二重循環掃描數組,找到i 和 j的和為target,再找出輸出下標

超時

方法2. 使用一個map(用Java的HashMap),按<數組元素,下標>存入map,然后對每個數組元素遍歷,紀錄下target減去數組元素的值leftNum,直接在這個map里面找到key為leftNum的,取出value,就是它的序號。這樣數組的index和這個value就是兩個下標值,比較大小,輸出

通過

官方方法:

O(n2) runtime, O(1) space – Brute force:

The brute force approach is simple. Loop through each element x and find if there is another value that equals to target – x. As finding another value requires looping through the rest of array, its runtime complexity is O(n2).

O(n) runtime, O(n) space – Hash table:

We could reduce the runtime complexity of looking up a value to O(1) using a hash map that maps a value to its index.

Q56.Merge Intervals

題目:給定一系列區間,如[1,3],[2,4],[5,6],讓你講所有區間的重疊區間合并并輸出,如前者輸出[1,4],[5,6]

思路:

方法1. 先對這個區間的左值進行排序,由小到大,形成新的區間集合,然后分情況討論(三種):1.如果前一個區間右值比后一個區間左值小,則直接存入結果數組。2.else1的情況下,而且前一個區間的右值比后一個區間的右值小,合并,只保留前一個區間的左值和后一個區間的右值。3.else2的情況下,前一個區間的右值比后一個區間的右值大,保留大的。最后別忘了把最后一組區間也加入到結果數組(沒有向后比較了)

通過

Q2.Add Two Numbers

方法1.

Q3.

Q4.

Q62.Unique Paths

給定一個m*n的方塊路徑,從左上角起點起,到右下角終點,只允許向右或者向下移動,問有多少種走法。

方法1. 看清本質,這個題實際上可以看作一個組合數求值。總共可以向右移動m-1種方法,向下移動n-1種方法。由于只允許向右向下一種,而且一定最后和起來是要走完最長的那一條(舉個例子,m>n,則最后一定把所有m-1個向右走的方法都會用一遍),所以,當m>n,就是求C(m-1+n-1)(m-1);n>=m就是球C(m-1+n-1)(n-1)

通過

136.Single Numble

一個數組,除了一個元素外,其它元素都重復2遍,找出那個元素

方法1. 利用異或的性質 ab;ab 異或運算表00=0;01=1;所以直接可以用0來異或一次得到真實值,異或兩次結果不變,所以直接對數組每個元素和初始為0的result異或即可。

141.Linked List Cycle

判斷一個鏈表是否存在環

方法1. 利用一個"快慢指針",即有兩個指針指向頭節點,一個快指針每次next兩次,一個每次next一次,使用while循環,只要存在一個環,必然經過一輪的循環下,一定會相遇。反之,不存在環,一定不會相遇。時間復雜度為O(n)

通過

208.Implement Trie (Prefix Tree)

實現一個字典樹

字典樹:一個26叉樹,每個結點代表一個字母,value存一個bool值,代表是否存在這個字母。如果對一個單詞進行查找,那么它只需要O(n)的時間,插入的時候也是O(n)。

方法1. 直接貼代碼吧:

class TrieNode {
public:
    // Initialize your data structure here.
    TrieNode() {
        for (int i = 0;i < MAX_NODE;i++) {
            next[i] = 0;
        }
        haveValue = false;
    }
    static const int MAX_NODE = 26;
    TrieNode* next[MAX_NODE];
    bool haveValue;//true repreasent have this character
};

class Trie {
public:
    Trie() {
        root = new TrieNode();
    }

    // Inserts a word into the trie.
    void insert(string s) {
        TrieNode* start = root;
        for (int i = 0;i < s.length();i++) {
            int index = s[i] - 'a';
            if (start->next[index] == 0){
                start->next[index] = new TrieNode();//new character at this node.and go on for next character
            }
            start = start->next[index];
        }
        start->haveValue = true;
    }

    // Returns if the word is in the trie.
    bool search(string key) {
        TrieNode* start = root;
        for (int i = 0;i < key.length();i++) {
            int index = key[i] - 'a';//start with character
            if (start->next[index] == 0){
                return false;
            }
            start = start->next[index];
        }
        return start && start->haveValue;//entire word
    }

    // Returns if there is any word in the trie
    // that starts with the given prefix.
    bool startsWith(string prefix) {
        TrieNode* start = root;
        for (int i = 0;i < prefix.length();i++) {
            int index = prefix[i] - 'a';
            if (start->next[index] == 0){
                return false;
            }
            start = start->next[index];
        }
        return start;//don't need complete all the character
    }

private:
    TrieNode* root;
};

// Your Trie object will be instantiated and called as such:
// Trie trie;
// trie.insert("somestring");
// trie.search("key");

通過

206. Reverse Linked List

就是簡單的反轉鏈表,要求有迭代和遞歸兩種解法

1.迭代法

#include <iostream>
using namespace std;


struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL){return NULL;}
        ListNode* prev = head;
        ListNode* current = head->next;
        ListNode* next;
        while (current) {
            next = current->next;
            current->next = prev;
            prev = current;
            current = next;
        }
        head->next = NULL;
        head = prev;
        return head;
    }
};

2.遞歸法

#include <iostream>
using namespace std;


struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL){
            return NULL;//fuck
        }
        if(head->next == NULL){
            return head;//stop
        }
        ListNode* next = head->next;//head will stay here
        ListNode* start = reverseList(next);
        head->next = NULL;
        next->next = head;
        return start;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,764評論 0 33
  • 她叫Alice,1989年被發現,從1992年開始被追蹤錄音。在其他鯨魚眼里,Alice就像是個啞巴。她這么多年來...
    歌者與貓Alice閱讀 404評論 0 0
  • 1、曼德拉的一句名言: “如果天空是黑暗的,那就摸黑生存;如果發出聲音是危險的,那就保持沉默;如果自覺無力發光的,...
    嬉笑怒罵皆生活閱讀 316評論 0 0