美文网首页
TOP 86 - 91

TOP 86 - 91

作者: 李伟13 | 来源:发表于2021-04-26 09:39 被阅读0次

    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);
        }
    }
    

    相关文章

      网友评论

          本文标题:TOP 86 - 91

          本文链接:https://www.haomeiwen.com/subject/wcsjrltx.html