TOP 86 - 91

406. 根據身高重建隊列

題解思路

1.先從高到矮排序
2.按照第二個參數k(前面有幾個人)將其放到index爲k的位置
vec的insert用法

iterator insert( iterator loc, const <T>&val );
void insert( iterator loc, size_type num, const <T>&val );
void insert( iterator loc, input_iterator start, input_iterator end );

這題裏用到的是第一種做法,似乎不用加const?

for (vector<int>& p : people) {
     res.insert(res.begin() + p[1], p);
}

416. 分割等和子集

題解思路

很明顯是一個01揹包問題
然而我忘記怎麼做了

vector<bool> dp(sum + 1);
dp[0] = true;
for (const int num : nums) {
    for (int i = sum; i >= num; --i) {
        dp[i] = dp[i] || dp[i - num];
    }
}

437. 路徑總和 III

我的思路【Failed】

對於每一個支路,都有多個任務,一個是8,還有上面節點下來的task,第二層是target和target - rootval,我打算用vector來存但是考慮到複雜度太高了就不考慮了

題解思路

使用前綴和,看題解一下子還沒看懂.然後做了一題簡單一點的類似的題

[3,4,7,6,1,3]假設k爲7,求和爲7的子數組個數
使用unordered_map m來做,需要注意的點.m[0] = 1,i0len,如果m[當前的前綴和 - 目標值]存在,

ans += m[presum - target]
m[presum]++

m[0]是爲了[4+3 -7]這樣的前綴和
回到本題

void dfs(TreeNode* root) {
    if (root == nullptr)    return;
    pre += root -> val;
    if (m.find(pre - sum) != m.end()) {
        res += m[pre - sum];
    }
    m[pre]++;
    dfs(root -> left);
    dfs(root -> right);
    m[pre]--;
    pre -= root -> val;
}

需要注意的是,trace back的時候,pre要減減,m[pre]也要減減

438. 找到字符串中所有字母異位詞

題解思路

使用滑動窗口比較哈希表。
我卡在比較兩個哈希表相等上了,我用unordered_map存的,要一個一個比較過去有點麻煩.

  • skill
    使用字母哈希,直接比較兩個vector是否相等就可以了,因爲vector重載了==運算符
for (int i = 0; i < s.size(); ++i) {
    window[s[i]]++;
    if (window == pch) {
        ans.push_back(i - plen + 1);
    }
    if (i >= plen - 1) {
        window[s[i + 1 - plen]]--;
    }
}

448. 找到所有數組中消失的數字

題解思路

我只能說是技巧題
有n個數的數組,數均在[1,n]之間,有的數重複了,有的數沒出現,找出沒出現的數的下標
1.把出現的數爲下標的那個數+n
2.遍歷一遍,<n的數的下標就是沒出現的數.過程中需要考慮基0這個條件

for (int& num : nums) {
    int x = (num - 1) % nums.size();
    nums[x] += nums.size();
}
vector<int> ans;
for (int i = 0;  i < nums.size(); ++i) {
    if (nums[i] <= nums.size()) {
        ans.push_back(i + 1);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章