美文网首页
TOP 100 57 - 64

TOP 100 57 - 64

作者: 李伟13 | 来源:发表于2021-04-21 00:47 被阅读0次

    169. 多数元素

    我的思路1

    sort,然后取[n / 2] 位置的,就是大于1/2个数的元素

    我的思路2

    使用哈希表

    unordered_map<int, int> um;
    for (int i = 0; i < nums.size(); ++i) {
        if (!um.count(nums[i])) {
            um[nums[i]] = 1;
        }
        else {
            um[nums[i]]++;
        }
    }
    for (auto& iter : um) {
        if (iter.second > nums.size() / 2) {
            return iter.first;
        }
    }
    return -1;
    

    其实可以在第一个for循环内就完成cnt的事.完成简化,也不需要使用count.简化如下

    for (int i = 0; i < nums.size(); ++i) {
        um[nums[i]]++;
        if (um[nums[i]] > nums.size() / 2) {
            return nums[i];
        }
    }
    
    题解思路1

    摩尔投票算法

    int candidate = nums[0];
    int count = 1;
    for (int i = 1; i < nums.size(); ++i) {
        if (count == 0) {
            candidate = nums[i];
        }
        if (nums[i] == candidate) {
            count++;
        }
        else {
            count--;
        }
    }
    return candidate;
    

    记一个当前值,一个当前值的count,当前值和其后一个值打架,不同count--,相同值count++.count为0时退位换新人上,个数大于n / 2的众数一定能赢到最后

    198. 打家劫舍

    我的思路
    • 动态规划
    • 滚动数组

    200. 岛屿数量

    我的思路

    使用深度优先遍历把岛屿上的1都变成0.
    计算1的数量

    207. 课程表

    有向图拓扑排序

    题解思路1 BFS

    计算入度
    1.入度为0进入队列
    2.将入度为0的后序节点入度减1,若为0,则push进队列
    3.若队列为空,计算经由队列的元素数量,若等于coursenum,则为true
    问题:如果456有环呢?
    那么5的入度为2,在前驱元素的后面的元素入度减1的时候就不为0,就进不了队列,cnt就会小于coursenum,false
    图里我没画箭头,箭头由上往下


    vector<int> indeg(numCourses);
    vector<vector<int> > edges(numCourses);
    
    for (const auto& vec : prerequisites) {
        //当前课程的入度++;
        indeg[vec[0]]++;
        //当前课程vec[0]的被存入先修课程vec[1]的后修表中
        edges[vec[1]].push_back(vec[0]);
    }
    queue<int> q;
    for (int i = 0; i <numCourses; ++i) {
        if (indeg[i] == 0) {
            //存入入度为0的i课程
            q.push(i);
        }
    }
    //设置一个计数变量看是否所有的课程都通过了队列
    int cnt = 0;
    while (!q.empty()) {
        cnt++;
        //取入度为0的队头
        int u = q.front();
        //遍历入度为0的课程的后面的课程,让它们的入度减一
        for (const int& v : edges[u]) {
            indeg[v]--;
            //如果入度为0,就入队列
            if (indeg[v] == 0) {
                q.push(v);
            }
        }
        //把队头给pop
        q.pop();
    }
    return cnt == numCourses;
    

    215. 数组中的第K个最大元素

    我的思路

    sort

    sort(nums.begin(), nums.end());
    return nums[nums.size() - k];
    

    我猜应该是基于快排(因为昨天刚看见)

    题解思路:堆

    维护动态数据的最大最小值,可以考虑堆
    建立容量为k的最大值堆
    https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/shu-zu-zhong-de-di-kge-zui-da-yuan-su-by-leetcode-/
    1.建立大根堆,抛掉k - 1个nums[0],调整大根堆。最后nums[0]就是第k个最大元素
    2.如何建立? 从 (heapsize - 1) - 1)开始向前maxHeapify
    3.如何maxHeapify,交换左右子节点的较大值给父节点,再对那个节点的左右子节点进行maxHeapify(节点值为之前父节点的值).

    相关文章

      网友评论

          本文标题:TOP 100 57 - 64

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