LeetCode 每周算法 8(栈、堆)

news2024/11/17 23:59:41

LeetCode 每周算法 8(栈、堆)

栈算法:

在这里插入图片描述

class Solution {  
public:  
    // 判断括号是否有效的函数  
    bool isValid(string s) {  
        int n = s.size(); // 获取字符串s的长度  
          
        // 如果字符串长度为奇数,则括号无法有效匹配,直接返回false  
        if (n % 2 == 1) {  
            return false;  
        }  
          
        // 创建一个哈希表(unordered_map),用于存储右括号到对应左括号的映射  
        unordered_map<char, char> pairs = {  
            {')', '('},  
            {']', '['},  
            {'}', '{'}  
        };  
          
        // 使用栈来辅助判断括号的匹配情况  
        stack<char> stk;  
          
        // 遍历字符串s中的每个字符  
        for (char ch : s) {  
            // 如果当前字符是右括号(即在pairs的键中存在)  
            if (pairs.count(ch)) {  
                // 如果栈为空,或者栈顶元素不是当前右括号对应的左括号,则括号无效,返回false  
                if (stk.empty() || stk.top() != pairs[ch]) {  
                    return false;  
                }  
                // 如果栈顶元素是当前右括号对应的左括号,则从栈中弹出该左括号  
                stk.pop();  
            }  
            // 如果当前字符是左括号,则直接压入栈中  
            else {  
                stk.push(ch);  
            }  
        }  
          
        // 遍历完所有字符后,如果栈为空,则说明所有括号都有效匹配,返回true  
        // 如果栈不为空,则说明有未匹配的左括号,返回false  
        return stk.empty();  
    }  
};

在这里插入图片描述

class MinStack {  
    // 使用一个栈来存储元素,其中每个元素都是一个pair<int, int>  
    // pair的第一个元素是用户压入栈的值,第二个元素是当前栈中的最小值  
    stack<std::pair<int, int>> stk;  
  
public:  
    // 构造函数,初始化一个空的栈  
    MinStack() {  
         
    }  
      
    // 将一个元素val压入栈中,并更新栈中的最小值  
    void push(int val) {  
        // 使用min函数比较当前val和栈顶的最小值,取两者中的较小者作为新的最小值  
        // 然后将这个值和val作为一个pair压入栈中  
        stk.push({val, std::min(val, getMin())});  
    }  
      
    // 弹出栈顶元素  
    void pop() {  
        stk.pop();  
    }  
      
    // 获取栈顶元素的值  
    int top() {  
        // 返回栈顶元素的第一个值,即用户压入栈的值  
        return stk.top().first;  
    }  
      
    // 获取栈中的最小元素  
    // 注意,这里使用了一个技巧:每次push时都更新栈顶元素为当前的最小值  
    // 因此,栈顶元素的第二个值总是当前栈中的最小值  
    int getMin() {  
        // 如果栈为空,则返回INT_MAX(表示没有最小值)  
        // 否则,返回栈顶元素的第二个值,即当前的最小值  
        return stk.empty() ? INT_MAX : stk.top().second;  
    }  
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

在这里插入图片描述

class Solution {  
public:  
    // 存储待解码的原始字符串  
    string src;  
    // 用于在解码过程中跟踪当前处理的字符位置  
    size_t ptr;  
  
    // 辅助函数,用于连续读取并转换数字字符为整数  
    // 返回从当前ptr位置开始读取的数字,并将ptr移动到数字之后的第一个非数字字符  
    int getDigits() {  
        int res = 0; // 用于存储读取到的数字  
        // 循环直到ptr指向的字符不是数字或达到src的末尾  
        while (ptr < src.size() && isdigit(src[ptr])) {  
            // 将当前数字乘以10并加上新读取的数字字符(减去'0'转换为整数)  
            res = res * 10 + src[ptr++] - '0';  
        }  
        return res;  
    }  
  
    // 辅助函数,用于递归地解码字符串  
    // 它会根据括号、数字和字母的组合来构建并返回解码后的字符串  
    string getString() {  
        // 如果ptr已经到达src的末尾或遇到']',说明当前没有更多的字符可以解码,返回空字符串  
        if (ptr == src.size() || src[ptr] == ']') {  
            return "";  
        }  
  
        char cur = src[ptr]; // 当前处理的字符  
        int repTime = 1; // 重复次数,默认为1(如果没有显式指定)  
        string res; // 用于存储解码后的字符串  
  
        // 如果当前字符是数字,说明后面跟着的是重复次数  
        if (isdigit(cur)) {  
            repTime = getDigits(); // 读取并设置重复次数  
            ++ptr; // 移动ptr到'['之后  
  
            // 递归调用getString来解码括号内的字符串  
            string str = getString();  
  
            // 遇到']'表示括号内字符串结束,移动ptr到']'之后  
            ++ptr;  
  
            // 根据重复次数构建结果字符串  
            while (repTime--) res += str;  
        }   
        // 如果当前字符是字母,直接添加到结果字符串中,并移动ptr  
        else if (isalpha(cur)) {  
            res = string(1, src[ptr++]); // 将当前字母添加到结果字符串  
        }  
  
        // 继续递归解码剩余部分,并将结果与当前解码结果拼接  
        return res + getString();  
    }  
  
    // 主要的解码函数,初始化src和ptr,并调用getString开始解码过程  
    string decodeString(string s) {  
        src = s;  
        ptr = 0;  
        return getString(); // 返回解码后的字符串  
    }  
};

在这里插入图片描述

class Solution {  
public:  
    // 函数接收一个整数向量作为输入,返回一个整数向量作为输出  
    // 每个输出元素表示输入向量中对应元素后面第一个更高温度的天数差  
    // 如果没有更高的温度,则输出为0  
    vector<int> dailyTemperatures(std::vector<int>& temperatures) {  
        // 初始化一个与输入向量相同大小的答案向量,并将所有元素初始化为0  
        // 这表示默认情况下,我们还没有找到任何更高的温度  
        vector<int> answer;  
        answer.resize(temperatures.size(), 0);  
            
        // 使用一个栈来存储温度索引,栈顶是最近加入且尚未找到更高温度的温度索引  
        stack<int> s;  
            
        // 遍历输入的温度向量  
        for (int i = 0; i < temperatures.size(); i++) {  
            // 当栈不为空且当前温度大于栈顶索引对应的温度时  
            // 说明我们找到了栈顶索引对应温度的下一个更高温度  
            while (!s.empty() && temperatures[i] > temperatures[s.top()]) {  
                // 计算天数差(当前索引减去栈顶索引)并存储在答案向量中  
                answer[s.top()] = i - s.top();  
                // 弹出栈顶索引,因为它已经找到了下一个更高温度  
                s.pop();  
            }  
            // 将当前索引压入栈中,以便后续查找更高温度  
            s.push(i);  
        }  
            
        // 返回填充好的答案向量  
        return answer;  
    }  
};

在这里插入图片描述

class Solution {  
public:  
    int largestRectangleArea(vector<int>& heights) {  
        stack<int> s; // 使用一个栈来存储柱子的索引  
        int answer = 0; // 存储最大矩形面积  
  
        // 在heights数组的开始和结束各添加一个高度为0的柱子,这是为了方便处理边界情况  
        // 特别是当第一个柱子或最后一个柱子很高时,可以确保它们也能被正确处理  
        heights.insert(heights.begin(), 0);  
        heights.push_back(0);  
  
        // 栈的初始元素为第一个柱子的索引(即0,高度为0的柱子)  
        s.push(0);  
  
        // 遍历每个柱子的索引(从1开始,因为0是添加的辅助柱子)  
        for (int i = 1; i < heights.size(); i++) {  
            // 如果当前柱子的高度大于栈顶柱子的高度,直接入栈  
            if (heights[i] > heights[s.top()]) {  
                s.push(i);  
            }   
            // 如果当前柱子的高度等于栈顶柱子的高度,也入栈(这里其实可以优化为不入栈,因为等高的柱子不会影响面积计算)  
            else if (heights[i] == heights[s.top()]) {  
                s.push(i);  
            }   
            // 如果当前柱子的高度小于栈顶柱子的高度,说明找到了一个矩形的右边界  
            else {  
                while (heights[i] < heights[s.top()]) {  
                    int mid = s.top(); // 栈顶柱子的索引,即当前矩形的“高”的柱子  
                    s.pop(); // 弹出栈顶元素,因为我们已经找到了以它为高的矩形的右边界  
  
                    // 计算矩形的宽度  
                    // 如果栈为空,说明左边没有柱子,宽度为i;否则为i与栈顶柱子索引之差减1  
                    int h = heights[mid]; // 矩形的高度  
                    int w = i - s.top() - 1; 
  
                    // 更新最大面积  
                    answer = max(answer, h * w);  
                }  
                // 将当前柱子的索引入栈,作为新的可能矩形的高度的起点  
                s.push(i);  
            }  
        }  
  
        // 遍历结束后,返回最大面积  
        return answer;  
    }  
};

在这里插入图片描述

class Solution {  
public:  
    int trap(vector<int>& height) {  
        // 创建一个栈来存储索引,而不是高度值  
        stack<int> s;  
        int sum = 0; // 用于记录总共接到的雨水量  
        // 栈中至少需要有一个元素作为起始边界,这里选择第一个元素作为起始  
        s.push(0);  
          
        // 从第二个元素开始遍历高度数组  
        for (int i = 1; i < height.size(); i++) {  
            // 如果当前元素的高度小于栈顶元素对应的高度,说明当前位置可能是一个水坑的一部分  
            // 将当前索引压入栈中,以便后续可能形成水坑时计算宽度  
            if (height[i] < height[s.top()]) {  
                s.push(i);  
            }   
            // 如果当前元素的高度等于栈顶元素对应的高度,同样压入栈中  
            // 这里其实可以优化,因为等高的元素不会增加新的水坑容量  
            else if (height[i] == height[s.top()]) {  
                s.push(i);  
            }   
            // 如果当前元素的高度大于栈顶元素对应的高度,说明找到了一个水坑的右边界  
            // 开始处理栈中存储的左边界到当前右边界之间的所有可能的水坑  
            else {  
                while (!s.empty() && height[i] > height[s.top()]) {  
                    int mid = s.top(); // 当前处理的水坑的底部索引  
                    s.pop(); // 弹出栈顶元素,即当前水坑的底部索引  
                    // 如果栈不为空,说明存在左边界  
                    if (!s.empty()) {  
                        // 计算水坑的高度:左右边界中较低的高度减去当前水坑底部的高度  
                        int h = min(height[s.top()], height[i]) - height[mid];  
                        // 计算水坑的宽度:右边界索引减去左边界索引再减一(因为左右边界本身不计入宽度)  
                        int w = i - s.top() - 1;  
                        // 将当前水坑的容量加到总容量上  
                        sum += h * w;   
                    }  
                }  
                // 将当前元素(右边界)压入栈中,作为下一个可能水坑的左边界  
                s.push(i);  
            }  
        }  
        // 返回总共接到的雨水量  
        return sum;  
    }  
};

堆算法:

在这里插入图片描述

class Solution {
public:
    // int quickselect(vector<int> &nums, int l, int r, int k) {
    //     if (l == r)
    //         return nums[k];
    //     int partition = nums[l], i = l, j = r;
    //     while (i < j) {
    //         while (nums[i] < partition) i++;
    //         while (nums[j] > partition) j--;
    //         if (i < j)
    //             swap(nums[i], nums[j]);
    //     }
    //     if (k <= j) return quickselect(nums, l, j, k);
    //     else return quickselect(nums, j + 1, r, k);
    // }
    // int findKthLargest(vector<int>& nums, int k) {
    //     int n = nums.size();
    //     return quickselect(nums, 0, n - 1, n - k);
    // }
    
    // 将以i为根的子树调整为最大堆  
    void maxHeapify(vector<int>& a, int i, int heapSize) {  
        int l = i * 2 + 1; // 左子节点的索引  
        int r = i * 2 + 2; // 右子节点的索引  
        int largest = i;   // 假设当前根节点是最大的  
    
        // 如果左子节点存在且大于当前最大节点,则更新最大节点  
        if (l < heapSize && a[l] > a[largest]) {  
            largest = l;  
        }  
    
        // 如果右子节点存在且大于当前最大节点,则更新最大节点  
        if (r < heapSize && a[r] > a[largest]) {  
            largest = r;  
        }  
    
        // 如果最大节点不是根节点,则交换它们,并递归地调整受影响的子树  
        if (largest != i) {  
            swap(a[i], a[largest]);  
            maxHeapify(a, largest, heapSize);  
        }  
    }  
    
    // 从给定的无序数组构建最大堆  
    void buildMaxHeap(vector<int>& a, int heapSize) {  
        // 从最后一个非叶子节点开始向上构建最大堆  
        // 因为叶子节点不需要调整,且非叶子节点的索引为(heapSize/2)-1到0  
        for (int i = heapSize / 2 - 1; i >= 0; i--) {  
            maxHeapify(a, i, heapSize);  
        }  
    }  
    
    // 找到数组中第k大的元素  
    int findKthLargest(vector<int>& nums, int k) {  
        int heapSize = nums.size();  
        buildMaxHeap(nums, heapSize); // 将nums构建为最大堆  
    
        // 移除堆顶元素(即当前最大元素),直到堆中只剩下k个元素  
        // 每次移除堆顶元素后,重新调整堆  
        for (int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {  
            swap(nums[0], nums[i]); // 将堆顶元素与堆尾元素交换  
            --heapSize; // 堆的大小减一  
            maxHeapify(nums, 0, heapSize); // 重新调整堆顶元素以满足最大堆的性质  
        }  
    
        // 此时,堆顶元素即为第k大的元素  
        return nums[0];  
    }  
    
    // 注意:在findKthLargest函数中,循环的条件是i >= nums.size() - k + 1  
    // 这意味着循环会执行k次,每次移除一个元素,直到堆中只剩下k个元素  
    // 由于最大堆的性质,堆顶元素始终是最大的,因此最后剩下的堆顶元素就是第k大的元素
};

在这里插入图片描述

class Solution {  
public:  
    // 静态比较函数,用于比较两个pair的第二个元素(即频率)  
    // 如果m的频率大于n的频率,则返回true,使得频率高的元素在优先队列中有更高的优先级  
    static bool cmp(pair<int, int>& m, pair<int, int>& n) {  
        return m.second > n.second;  
    }  
    // 函数用于找出nums中出现频率最高的k个元素  
    vector<int> topKFrequent(vector<int>& nums, int k) {  
        // 使用unordered_map记录每个元素的出现次数  
        unordered_map<int, int> occurrences;  
        for (auto& v: nums) {  
            occurrences[v]++;  
        }  
        // 定义一个最小堆(但通过自定义比较函数cmp实现最大堆的效果)  
        // 堆中存储的是pair<int, int>,其中first是元素值,second是元素的出现次数  
        // 使用decltype(&cmp)作为比较函数的类型,确保类型安全  
        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);  
          
        // 遍历每个元素及其出现次数  
        for (auto& [num, count] : occurrences) {  
            // 如果堆的大小已经达到k,则比较堆顶元素(当前堆中最小的元素,即频率最低的)与当前元素的频率  
            if (q.size() == k) {  
                if (q.top().second < count) {  
                    // 如果当前元素的频率大于堆顶元素的频率,则弹出堆顶元素,并将当前元素加入堆中  
                    q.pop();  
                    q.emplace(num, count);  
                }  
                // 如果当前元素的频率不大于堆顶元素的频率,则不做任何操作,继续遍历下一个元素  
            } else {  
                // 如果堆的大小还未达到k,则直接将当前元素加入堆中  
                q.emplace(num, count);  
            }  
        }  
        // 构建结果向量,从堆中依次取出元素(即频率最高的k个元素),并将它们逆序排列(因为是从堆中依次弹出的)  
        // 但由于题目要求只是返回这些元素,而不关心它们的具体顺序,所以这里不需要额外处理顺序问题  
        vector<int> result;  
        while (!q.empty()) {  
            result.emplace_back(q.top().first);  
            q.pop();  
        }  
        // 返回结果向量  
        return result;  
    }  
};

在这里插入图片描述

class MedianFinder {  
public:  
    // 使用最小堆来存储较大的一半元素(确保堆顶为较小的一半中的最大值)  
    priority_queue<int, vector<int>, greater<int>> queMax;  
    // 使用最大堆来存储较小的一半元素(确保堆顶为较大的一半中的最小值)  
    priority_queue<int, vector<int>, less<int>> queMin;  
  
    // 构造函数,初始化两个堆  
    MedianFinder() {}  
  
    // 添加一个数到中位数查找器中  
    void addNum(int num) {  
        // 如果queMin为空或者新加入的元素小于等于queMin的堆顶元素(即较小一半中的最大值)  
        if (queMin.empty() || num <= queMin.top()) {  
            queMin.push(num);  
            // 如果此时queMin的大小比queMax大2,说明queMin中多出了一个元素,需要将其移动到queMax中  
            if (queMax.size() + 1 < queMin.size()) {  
                queMax.push(queMin.top());  
                queMin.pop();  
            }  
        } else {  
            // 否则,新加入的元素大于queMin的堆顶元素,应该加入到queMax中  
            queMax.push(num);  
            // 如果此时queMax的大小比queMin大1,说明queMax中多出了一个元素,需要将其移动到queMin中  
            if (queMax.size() > queMin.size()) {  
                queMin.push(queMax.top());  
                queMax.pop();  
            }  
        }  
        // 通过这种方式,我们保持两个堆的大小平衡,或者queMin比queMax多一个元素(对于奇数个元素的情况)  
    }  
  
    // 查找当前的中位数  
    double findMedian() {  
        // 如果queMin中的元素比queMax多,说明元素总数是奇数,中位数就是queMin的堆顶元素  
        if (queMin.size() > queMax.size()) {  
            return queMin.top();  
        }  
        // 否则,元素总数是偶数,中位数是两个堆顶元素的平均值  
        return (queMin.top() + queMax.top()) / 2.0;  
    }  
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用多模态输入的自我中心运动跟踪与理解框架:EgoLM

随着增强现实(AR)和虚拟现实(VR)技术的发展,对自我中心(第一人称视角)运动的精确跟踪和理解变得越来越重要。传统的单一模态方法在处理复杂场景时存在诸多局限性。为了解决这些问题,研究者们提出了一种基于多模态输入的自我中心运动跟踪与理解框架——EgoLM。本文将详细…

群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 飞牛fnOS 📒📝 什么是飞牛fnOS?📝 准备工作📝 安装飞牛fnOS📝 影视刮削⚓️ 相关链接 ⚓️📖 介绍 📖 最近有一款很火的国产NAS系统吸引了不少用户的注意。你是否曾想过,将这种新兴系统安装到你的群晖设备上,实…

选读算法导论5.2 指示器随机变量

为了分析包括包括雇佣分析在内的许多算法&#xff0c;我们将使用指示器随机变量&#xff0c;它为概率和期望之间的转换提供了一个便利的方法&#xff0c;给定一个样本空间S和事件A&#xff0c;那么事件A对应的指示器随机变量&#xff1a; Xa 1 如果A发生    0 如果…

EEditor中的redo/uodo机制

本文分析EEditor中的redo/undo机制&#xff0c;并比较与常见的C中的undo/redo机制的区别。 内容 和传统的C中Command设计模式一致&#xff0c;EcommandManager管理命令&#xff0c;同时提供了命令类ECommand。其中EcommandManager中存在两个列表&#xff0c;一个为可撤销命令列…

网页设计进阶:favicon 图标、CSS 隐藏样式与鼠标样式

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 favicon图标 CSS 隐藏样式 鼠标样式 非 VIP 用户可前往公众号回复“css”进行免费阅读 favicon图标 在网页中引入 favicon 图标时,可采用如下的页面引入方法: <link rel="shortcut icon" hre…

3种解决Docker容器中配置运行环境的方法

1. dockerfile用于通过脚本生成镜像 2.进入docker容器后&#xff0c;配置环境完&#xff0c;导出容器快照为镜像&#xff0c;拷贝到另一个主机&#xff0c;再进行加载&#xff1b; 3.在本地将依赖库等需要的文件按照目录整理好&#xff0c;映射到docker中。 1. dockerfile用于…

衡石分析平台系统管理手册-功能配置之资源管理

资源管理​ 系统管理员可以对系统中的所有资源进行查看、转移所有权、删除操作&#xff1b; 可以查看特定用户持有的资源&#xff0c;从而可用在资源转移/删除后&#xff0c;删除用户、释放系统资源&#xff1b; 在组织用户变动较大时&#xff0c;可以实现资源的整理和回收。…

力扣 最小覆盖子串

最小覆盖子串 https://leetcode.cn/problems/minimum-window-substring/ 题目描述 题目分析f 覆盖子串&#xff1a;首先根据题意&#xff0c;要求目标字符串的元素必须都在子串中出现过&#xff0c;这表明可以是乱序出现。所以在解决问题是我们需要对子串和目标字符串做匹配&a…

408数据结构解析模版

第一题&#xff1a; 解析&#xff1a; 答案选A。 第二题&#xff1a; 解析&#xff1a; 答案选A。 第三题&#xff1a; 解析&#xff1a; 答案选A。 第四题&#xff1a; 解析&#xff1a; 答案选A。 第五题&#xff1a; 解析&#xff1a; 答案选A。 第六题&#xff1a; 解析…

数据结构与算法——Java实现 22.有效的括号

目录 22. 有效的括号 思路 接口 数组实现类 有效的括号 力扣 直到有一天&#xff0c;我不会再问离开的人为什么 —— 24.9.28 22. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发)】传感器服务

使用场景 Sensor Service Kit&#xff08;传感器服务&#xff09;使应用程序能够从传感器获取原始数据&#xff0c;并提供振感控制能力。 Sensor&#xff08;传感器&#xff09;模块是应用访问底层硬件传感器的一种设备抽象概念。开发者可根据传感器提供的相关接口订阅传感器…

新电脑需要安装杀毒软件吗?

以下是关于新电脑是否需要安装杀毒软件的建议&#xff1a; 如果您经常访问各类网站&#xff0c;下载未知来源的文件&#xff0c;或者使用外部存储设备交换数据&#xff0c;那么安装杀毒软件是有必要的。 操作步骤&#xff1a;选择一款知名的杀毒软件&#xff0c;如 360 杀毒、腾…

KaiOS statusbar 更新代码逻辑

简介 状态栏在system APP,KaiOS上面的代码路径是 gaia/apps/system。 statusbar.js 代码结构 gaia\apps\system\js\statusbar.js 状态栏逻辑 statusbar.js代码结构-1-变量 statusbar.js代码结构-2-detail StatuBar 对象 var StatusBar = {serviceState: function sb_updat…

[spring]SpringBoot拦截器 统一数据返回格式 统一异常处理

文章目录 一. 拦截器1. 什么是拦截器2. 拦截器的使用自定义拦截器注册配置器拦截路径 3. 适配器模式 二. 统一数据返回格式异常处理 三. 统一异常处理 一. 拦截器 1. 什么是拦截器 例如, 图书管理系统, 在访问图书list页面之前, 需要先进行登录, 如果没登录, 就需要进行强制跳…

SpringCloud入门(九)Feign实战应用和性能优化

一、Feign实战应用 Feign的客户端与服务提供者的controller代码非常相似&#xff1a; 有没有一种办法简化这种重复的代码编写呢&#xff1f; 方式一&#xff1a;继承 优点&#xff1a; 简单。实现了代码共享。 缺点&#xff1a;服务提供方、服务消费方紧耦合。参数列表中的注解…

【Docker】如何让docker容器正常使用nvidia显卡

首先确保宿主机正常安装了显卡驱动 nvidia-smi打印显卡信息如下&#xff1a; 安装nvidia-container-toolkit工具 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker运行如下命令测试显卡是否在容器内可用 …

conda安装包离线安装环境

最近使用dokcerfile去创建镜像的时候&#xff0c;使用conda安装nvidia-cuda 总是失败&#xff0c;网络问题很大 可以通过离线的方式下载conda的安装包&#xff0c;然后放入文件中离线安装 通过以下命令得到安装包地址 conda search cudatoolkit --info 复制安装包地址到浏览器…

YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

JMeter 实现 MQTT 协议压力测试 !

1. 下载jmeter&#xff0c;解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例&#xff0c;下载地址&#xff1a; https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压&#xff1a; unzip apache-jmeter-5.4.3.zip 2. 下载…

最新最全的阿里大模型面试真题!看到就是赚到

前言 随着人工智能技术的飞速发展&#xff0c;计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;、搜索、推荐、广告推送和风险控制等领域的岗位越来越受到追捧&#xff0c;掌握大型模型技术已成为这些岗位的必备技能。然而&#xff0c;目前公开…