LeetCode熱題(HOT 100)解題思路與代碼

739. 每日溫度

題意就是要找在給定的一個序列中,指定元素後方第一個比它大的元素與該元素之間的距離,這道題借鑑了題解中第一位作者pilsaryu的思路(沒有用棧來做,主要是還不太會用STL^_ ^),逆序對該數組進行遍歷,遍歷過程中首先記下倒數第一二個數的結果到結果數組中,然後對於其餘元素,先與該元素後方的第一個元素比較,如果該元素比後方第一個元素小,那麼該位置結果爲1,結果寫入結果數組,並continue到下次循環中;如果比後方第一個元素大,則通過之前得到的結果數組來直接尋找比後一個元素大的位置的元素,並進行比較,以此類推,直到查詢到數組的最末端(這樣就不用對每一個元素進行遍歷)。
簡單來講就相當於在一個隊伍中大家都拿着數字牌子,我先問一下我後面的人,發現他的數字沒有我的大,然後我問他,上一個比你更大的在哪?然後我直接去找那個人,再比較,如果沒有,繼續問,繼續比較,直到找到隊尾,如果一直到隊尾都沒有人比我的數字大,那我這裏結果就是0。
我這裏是用容器做的,第一次用迭代器,兩個迭代器繞來繞去都要繞暈了而且不能互相賦值,後來發現可以直接用int來代替迭代器,我。。。

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        vector<int> indexArr(T.size(), 0);
        for(auto it = T.end()-2, itIndex = indexArr.end()-2; it != T.begin()-1; it--)
        {
            auto src = itIndex; // 記錄當前位置
            if(*it < *(it+1)) // 比較與後一位數字的大小
            {
                *src = 1;
                itIndex--; // 後退一位繼續循環
                continue;
            }
            for(itIndex++; itIndex != indexArr.end(); itIndex+=*itIndex)
            {
                if(*it < *(it+(itIndex-src)))
                {
                    *src = itIndex-src;
                    break;
                }
                else if(*itIndex == 0)
                {
                    *src = 0;
                    break;
                }
            }
            itIndex = src-1; // 重新給itIndex賦值,使其指向前一位
        }
        return indexArr;
    }
};

在這裏插入圖片描述

647. 迴文子串

621. 任務調度器

在這裏插入圖片描述
第一眼看到這個題,感覺題意跟以前經常見到的一個做飯時間最短的問題差不多。首先想法就是以任務數量最多的那一個任務(設爲A)爲基準進行求解,然後第二個、第三個任務等等就可以往任務A的冷卻間隔中插入,由於插入過程只有一種(因爲要保持冷卻間隔),所以不用考慮具體的插入代碼,基本思路就是這樣。

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        // 基本思路就是先執行最多的任務(A),然後執行第二多(B),以此類推
        // 在最多的任務(A)被執行後的時間,一到n就再次執行A,以便降低最後的冷卻時間,從而使時間最短
        // 最短時間是與最多次數的任務直接相關的
        
        // 解法
        int task[26] = {0}; // 初始化一個全爲0的任務數組,用來統計任務數量
        int length = tasks.size();
        // 1.先遍歷一遍列表,求出任務種類數和每種任務的數量
        for(auto it = tasks.begin(); it != tasks.end(); it++)
        {
            task[(*it-'A')]++;
        }
        sort(task, task+26); // 對任務數組進行升序排列
        int maxTask = task[25]; // 最多的任務次數
        int cntTask = (maxTask - 1) * (n + 1) + 1; // 最少要執行的任務次數
        for(int i = 24; i >= 0 && task[i] == maxTask; i--)
        {
            cntTask++;
        }
        // 當間隔可以容納下所有的任務時,返回cntTask,當間隔不能滿足時,返回數組長度
        return cntTask > length ? cntTask : length;
    }
};

這裏涉及到一個返回時比較大小的問題,現在考慮一下代碼中的循環部分,思路是當碰到一個跟A任務數量相同的任務(B)時,這時A和B是同樣排開的(例如A-B-A-B-A-B),所以就要在A所計算出的最小任務時間上加一,後面以此類推。
這時就出現一個問題,如果所有任務A的總間隔(A-1)*n能放得下其餘任務,那麼我們便可以直接返回最小時間;如果A的冷卻間隔不能夠容下所有任務呢?這時就可以直接返回數組長度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章