面試常考算法

排序算法:

穩(wěn)定性:

穩(wěn)定的排序算法:基數(shù)排序遂赠,冒泡排序久妆,直接插入排序,折半插入排序跷睦,歸并排序筷弦。
不穩(wěn)定的排序算法:快速排序,選擇排序抑诸,希爾排序烂琴,堆排序。

快排:

一次劃分會(huì)將一個(gè)元素pivot放置到最終的位置上哼鬓。
時(shí)間復(fù)雜度:最好O(nlogn)监右,最差O(n^2),一般為O(nlogn)异希。
空間復(fù)雜度:O(logn)健盒。
穩(wěn)定性:不穩(wěn)定。

void quick_sort(vector<int>& nums, int L, int R){
        if (L < R){
            int i = L;
            int j = R;
            int pivot = nums[L];
            while (i < j)
            {
                while (i < j && nums[j] >= pivot){
                    j--;
                }
                if (i < j){
                    nums[i] = nums[j];
                    i++;
                }
                while (i < j && nums[i] < pivot){
                    i++;
                }
                if (i < j){
                    nums[j] = nums[i];
                    j--;
                }
            }
            nums[i] = pivot;
            quick_sort(nums, L, i - 1);
            quick_sort(nums, i + 1, R);
        }
    }   

遍歷二叉樹:

前序遍歷二叉樹

前序遍歷的遞歸寫法1:
class Solution
{
private:
    vector<int> res;
public:
    vector<int> preorderTraversal(TreeNode* root){
        dfs(root);
        return res;
    }

    void dfs(TreeNode* cur){
        if(cur == NULL){
            return;
        }

        //根節(jié)點(diǎn)
        res.push_back(cur->val);
        //左子節(jié)點(diǎn)
        dfs(cur->left);
        //右子節(jié)點(diǎn)
        dfs(cur->right);
    }
    
};
前序遍歷的遞歸寫法2:
class Solution
{
private:
    vector<int> res;
public:
    vector<int> preorderTraversal(TreeNode* root){
        if(root){
            //根節(jié)點(diǎn)
            res.push_back(root->val);
            //左子節(jié)點(diǎn)
            preorderTraversal(root->left);
            //右子節(jié)點(diǎn)
            preorderTraversal(root->right);
        }
        return res;
    }    
};
前序遍歷的迭代寫法1:
vector<int> preorderTraversal(TreeNode* root){
        std::vector<int> res;
        stack<TreeNode*> stk;
        if(root != NULL){
            stk.push(root);
        }
        while(!stk.empty()){
            TreeNode* node = stk.top();
            if(node != NULL){
                stk.pop();
                if(node->right){
                    //添加右子節(jié)點(diǎn)
                    stk.push(node->right);
                }
                if(node->left){
                    //添加左子節(jié)點(diǎn)
                    stk.push(node->left);
                }
                //添加中節(jié)點(diǎn)
                stk.push(node);
                stk.push(NULL);
            }
            else{
                stk.pop();
                node = stk.top();
                stk.pop();
                res.push_back(node->val);
            }
        }
        return res;
    }
前序遍歷的迭代寫法2:
vector<int> preoederTraversal(TreeNode* root){
    vector<int> res;
    stack<TreeNode*> stk;
    stk.push(root);
    while (!stk.empty())
    {
        TreeNode* node = stk.top();
        stk.pop();

        if (node != NULL){
            //根節(jié)點(diǎn)
            res.push_back(node->val);
        }
        else{
            continue;
        }
        //右子節(jié)點(diǎn)進(jìn)棧
        stk.push(node->right);
        //左子節(jié)點(diǎn)進(jìn)棧
        stk.push(node->left);
    }
    return res;
}

中序遍歷二叉樹

中序遍歷的遞歸寫法1:
vector<int> res;
vector<int> midorderTraversal(TreeNode* root){
    dfs(root);
    return res;
}
void dfs(TreeNode* root){
    if (root == NULL){
        return;
    }
    dfs(root->left);
    res.push_back(root->val);
    dfs(root->right);
}
中序遍歷的遞歸寫法2:
vector<int> midorderTraversal(TreeNode* root){
    vector<int> res;
    if (root){
        midorderTraversal(root->left);
        res.push_back(root->val);
        midorderTraversal(root->right);
    }
    return res;
}
中序遍歷的迭代寫法1:
vector<int> midorderTraversal(TreeNode* root){
    vector<int> res;
    stack<TreeNode*> stk;
    if (root != NULL){
        stk.push(root);
    }
    while (!stk.empty()){
        TreeNode* node = stk.top();
        if (node){
            stk.pop();
            if (node->right){
                stk.push(node->right);
            }

            stk.push(node);
            stk.push(NULL);

            if (node->left){
                stk.push(node->left);
            }
        }
        else{
            stk.pop();
            node = stk.top();
            stk.pop();
            res.push_back(node->val);
        }
    }
    return res;
}
中序遍歷的迭代寫法2:
vector<int> midorderTraversal(TreeNode* root){
    vector<int> res;
    stack<TreeNode*> stk;
    TreeNode* cur = root;
    
    while (cur || !stk.empty()){
        if (cur){
            stk.push(cur);
            cur = cur->left;
        }
        else{
            cur = stk.top();
            stk.pop();
            res.push_back(cur->val);
            cur = cur->right;
        }
    }
    return res;
}

后序遍歷二叉樹

后序遍歷的遞歸寫法1:
vector<int> res;
vector<int> postorderTraversal(TreeNode* root){
    dfs(root);
    return res;
}

void dfs(TreeNode* root){
    if (root == NULL){
        return;
    }

    dfs(root->left);
    dfs(root->right);
    res.push_back(root->val);
}
后序遍歷的遞歸寫法2:
vector<int> postorderTraversal(TreeNode* root){
    vector<int> res;
    if (root){
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        res.push_back(root->val);
    }
    return res;
}
后序遍歷的迭代寫法1:
vector<int> postorderTraversal(TreeNode* root){
    vector<int> res;
    stack<TreeNode*> stk;
    if (root != NULL){
        stk.push(root);
    }

    while (!stk.empty()){
        TreeNode* node = stk.top();
        if (node != NULL){
            stk.pop();

            stk.push(node);
            stk.push(NULL);

            if (node->right){
                stk.push(node->right);
            }

            if (node->left){
                stk.push(node->left);
            }
        }
        else{
            stk.pop();
            node = stk.top();
            stk.pop();
            res.push_back(node->val);
        }
    }
    return res;
}
后序遍歷的迭代寫法2:
vector<int> postorderTraversal(TreeNode* root){
    vector<int> res;
    stack<TreeNode*> stk;
    stk.push(root);
    while (!stk.empty()){
        TreeNode* node = stk.top();
        stk.pop();
        if (node){
            res.push_back(node->val);
        }
        else{
            continue;
        }       
        stk.push(node->left);
        stk.push(node->right);
    }
    reverse(res.begin(), res.end());
    return res;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末称簿,一起剝皮案震驚了整個(gè)濱河市扣癣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憨降,老刑警劉巖父虑,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異授药,居然都是意外死亡士嚎,警方通過查閱死者的電腦和手機(jī)呜魄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莱衩,“玉大人爵嗅,你說我怎么就攤上這事”恳希” “怎么了睹晒?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)括细。 經(jīng)常有香客問我伪很,道長(zhǎng),這世上最難降的妖魔是什么奋单? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任锉试,我火速辦了婚禮,結(jié)果婚禮上辱匿,老公的妹妹穿的比我還像新娘键痛。我一直安慰自己炫彩,他們只是感情好匾七,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著江兢,像睡著了一般昨忆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杉允,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天邑贴,我揣著相機(jī)與錄音,去河邊找鬼叔磷。 笑死拢驾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的改基。 我是一名探鬼主播繁疤,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秕狰!你這毒婦竟也來了稠腊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸣哀,失蹤者是張志新(化名)和其女友劉穎架忌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體我衬,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹放,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年饰恕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片井仰。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂盐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糕档,到底是詐尸還是另有隱情莉恼,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布速那,位于F島的核電站俐银,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏端仰。R本人自食惡果不足惜捶惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荔烧。 院中可真熱鬧吱七,春花似錦、人聲如沸鹤竭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臀稚。三九已至吝岭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吧寺,已是汗流浹背窜管。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚机,地道東北人幕帆。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赖条,于是被迫代替她去往敵國(guó)和親失乾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355