[Algorithm][综合训练][合并k个已排序的链表][dd爱旋转][小红取数]详细讲解

news2024/11/13 19:07:46

目录

  • 1.合并k个已排序的链表
    • 1.题目链接
    • 2.算法原理讲解 && 代码实现
  • 2.dd爱旋转
    • 1.题目链接
    • 2.算法原理详解 && 代码详解
  • 3.小红取数
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.合并k个已排序的链表

1.题目链接

  • 合并k个已排序的链表

2.算法原理讲解 && 代码实现

  • 自己的解法:堆 -> 将全部节点丢入堆中
    class Solution 
    {
        typedef pair<int, ListNode*> PIL;
    public:
        ListNode* mergeKLists(vector<ListNode*>& lists) 
        {
            priority_queue<PIL, vector<PIL>, greater<>> heap;
            for(const auto& list : lists)
            {
                ListNode* cur = list;
                while(cur)
                {
                    heap.push({cur->val, cur});
                    cur = cur->next;
                }
            }
    
            ListNode* newHead = new ListNode(0);
            ListNode* tail = newHead;
            while(heap.size())
            {
                ListNode* node = heap.top().second;
                heap.pop();
    
                tail->next = node;
                tail = tail->next;
            }
            tail->next = nullptr;
            
            tail = newHead->next;
            delete newHead;
    
            return tail;
        }
    };
    
  • 优化解法:堆 -> 只存入每个链表的头结点,出堆时,再压入下一个节点
    • 对自己的版本进行了时间上和空间上的优化
    • 并且对堆排序时的比较方法进行了优化
    class Solution 
    {
        struct CMP
        {
            bool operator()(ListNode* l1, ListNode* l2)
            {
                return l1->val > l2->val;
            }
        };
    public:
        ListNode* mergeKLists(vector<ListNode*>& lists) 
        {
            priority_queue<ListNode*, vector<ListNode*>, CMP> heap;
            for(auto head : lists)
            {
                if(head != nullptr)
                {
                    heap.push(head);
                }
            }
    
            ListNode* newHead = new ListNode(0);
            ListNode* tail = newHead;
            while(heap.size())
            {
                ListNode* tmp = heap.top();
                heap.pop();
    
                tail = tail->next = tmp;
    
                if(tmp->next != nullptr)
                {
                    heap.push(tmp->next);
                }
            }
    
            tail = newHead->next;
            delete newHead;
    
            return tail;
        }
    };
    

2.dd爱旋转

1.题目链接

  • dd爱旋转

2.算法原理详解 && 代码详解

  • 解法:模拟 + 优化
    • 180° --> 一次行对称 + 一次列对称
    • 行列的顺序无所谓
    • 如果为偶数次,则无需变换
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int n = 0;
    vector<vector<int>> matrix;
    
    void SwapRol() // 行对称
    {
        for(int i = 0; i < n / 2; i++)
        {
            for(int j = 0; j < n; j++)
            {
                 swap(matrix[i][j], matrix[n - 1 - i][j]);
            }
        }
    }
    
    void SwapCol() // 列对称
    {
        for(int j = 0; j < n / 2; j++)
        {
            for(int i = 0; i < n; i++)
            {
                 swap(matrix[i][j], matrix[i][n - 1 - j]);
            }
        }
    }
    
    int main()
    {
        cin >> n;
        
        matrix.resize(n, vector<int>(n, 0));
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                cin >> matrix[i][j];
            }
        }
    
        int q = 0, x = 0;
        cin >> q;
        
        int row = 0, col = 0;
        while(q--)
        {
            cin >> x;
            if(x == 1)
            {
                row++, col++;
            }
            else
            {
                row++;
            }
        }
        
        if(row %= 2)
        {
            SwapRol();
        }
        
        if(col %= 2)
        {
            SwapCol();
        }
        
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
            {
                cout << matrix[i][j] << " ";
            }
            cout << endl;
        }
    
        return 0;
    }
    

3.小红取数

1.题目链接

  • 小红取数

2.算法原理详解 && 代码实现

  • 解法:01背包 + 同余(倍数问题可以转换为余数问题)
    • 同余定理
      请添加图片描述

    • 状态表示dp[i][j]:从前i个数中挑选,总和%k等于j时,最大和是多少

    • 状态转移方程
      请添加图片描述

    • 初始化
      请添加图片描述

    • 返回值dp[n][0] --> 因为k的倍数的余数为0

    #include <iostream>
    #include <vector>
    #include <climits>
    using namespace std;
    
    int main()
    {
        int n = 0, k = 0;
        cin >> n >> k;
    
        vector<long long> nums(n + 1, 0);
        for(int i = 1; i <= n ; i++)
        {
            cin >> nums[i];
        }
    
        vector<vector<long long>> dp(n + 1, vector<long long>(k, LLONG_MIN));
        dp[0][0] = 0;
    
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < k; j++)
            {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][(j - nums[i] % k + k) % k] + nums[i]);
            }
        }
    
        cout << (dp[n][0] <= 0 ? -1 : dp[n][0]) << endl;
    
        return 0;
    }
    

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

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

相关文章

网络性能优化的几个思路

指标工具 工具指标 网络性能优化 总的来说&#xff0c;先要获得网络基准测试报告&#xff0c;然后通过相关性能工具&#xff0c;定位出网络性能瓶颈。再接下来的优化工作&#xff0c;就是水到渠成的事情了。 当然&#xff0c;还是那句话&#xff0c;要优化网络性能&#xff0…

Stable Diffusion majicMIX_realistic模型的介绍及使用

一、简介 majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上&#xff0c;通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实&#xff0c;但通常情况下缺乏奇幻性&a…

前后端交互的路径怎么来的?后端解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…

MySQL将数据库所有表格和列编码格式从utf8mb3换成utf8mb4

最近在做数据导入&#xff0c;发现客户数据很多都带特殊符号&#xff0c;然后数据库就会提示 “java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8C\xB8\xEF\xBC…’ for column ‘name’ at row 1”&#xff0c;看了一下数据库对应字段字符集是 utf8mb3 的&#…

<Python><AI>基于智谱AI免费大模型GLM-4-Flash的智能聊天程序

前言 智谱AI开放了一个免费使用的大模型GLM-4-Flash&#xff0c;官方也提供了python的示例程序&#xff0c;我们结合pyqt5来编写一个基于GLM-4的简单的智能聊天工具。 界面大致如下&#xff1a; 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&a…

Fedora koji构建系统详细教程之二 -- 构建

写在前面 本篇文章是上一篇文章的继续&#xff0c;由于koji里面的内容实在是太多&#xff0c;都塞进一篇文章里会显得很臃肿&#xff0c;于是我就拆成了两部分。在上一篇文章里&#xff0c;我们已经部署好了Fedora koji系统&#xff0c;此时kojihub已经运行、可以通过kojiweb或…

LavaDome:一款基于ShadowDOM的DOM树安全隔离与封装工具

关于LavaDome LavaDome是一款针对HTML代码安全和Web安全的强大工具&#xff0c;该工具基于ShadowDOM实现其功能&#xff0c;可以帮助广大研究人员实现安全的DOM节点/树隔离和封装。 在当今的Web标准下&#xff0c;尚无既定方法可以安全地选择性地隔离DOM子树。换句话说&#x…

这是不一样的svg图像优化哦。-可优化也可转换为组件

田间的风吹老了岁月&#xff0c;老舍笔下的茶馆写的是近代史&#xff0c;真的写尽了当时的苦态&#xff0c;可能现在的地铁写的是现代史吧。时光飞逝&#xff0c;很快就工作两三年了。昨天做项目的时候&#xff0c;引入svg图像转换为组件的时候&#xff0c;觉得很麻烦&#xff…

2.2 语言处理程序基础

以编译方式翻译C/C源程序的过程中&#xff0c;类型检查在&#xff08; &#xff09;阶段处理。 A. 词法分析 B. 语义分析 C. 语法分析 D. 目标代码生成 正确答案是 B。 解析 本题考查的是编译器工作过程。 A选项词法分析阶段处理的错误&#xff1a;非法字符、单词拼写错误等。与…

《王者荣耀》游戏玩法与部分机制分析

目录 游戏机制 MOBA核心玩法 匹配机制 游戏模式 隐藏分机制 游戏规则 总结 王者荣耀的ELO匹配机制是如何具体工作的&#xff1f; 王者荣耀中隐藏分机制的详细规则是什么&#xff1f;&#xff08;难绷&#xff01;&#xff09; 王者荣耀边境突围和五军对决模式的具体玩…

解释:有序树是什么意思?

目录 有序树的特性&#xff1a; 例子&#xff1a; 总结 &#x1f31f; 嗨&#xff0c;我是命运之光&#xff01; &#x1f30d; 2024&#xff0c;每日百字&#xff0c;记录时光&#xff0c;感谢有你一路同行。 &#x1f680; 携手启航&#xff0c;探索未知&#xff0c;激发…

STM32基于HAL库使用串口+DMA 不定长接收数据 学习记录

我这些博客都只是记录一下自己学习的内容&#xff0c;以及记录一些思考过的问题和疑惑的东西 这里的代码借鉴了一位博主的博客 地址&#xff1a;[] 这里cubemx串口基础配置部分参考这一篇博客 &#xff08;只配置了串口中断接收和printf重定向&#xff09; 这一篇博客我们需要开…

C++编程:理解左值(lvalue)和右值(rvalue)

C 值的分类(Value Categories) 目录 1 概述 2 主要分类 1.1 左值(lvalue) 1.1.1 左值详情 1.1.2 左值属性 1.2 纯右值(prvalue) 1.2.1 纯右值详情 1.2.2 纯右值属性 1.3 将逝值(xvalue) 1.3.1 将逝值详情 1.3.2 将逝值属性 3 混合分类 3.1 泛型左值…

Day51 | 117. 软件构建(拓扑排序)47. 参加科学大会 dijkstra(朴素版)

语言 117. 软件构建 117. 软件构建 题目 题目描述 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依赖于文件 B&#xff0c;则必须在处理…

【STM32】通用定时器TIM(时钟源选择与更新中断)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 通用定时器简介 定时器时钟使能 选择时基单元时钟源 内部时钟源 外部时钟源 时基单元初始化 更新中断使能 定时器使能 定时器中断代码 Timer.h Timer.c 获取计数值 TIM(Time…

【王树森】RNN模型与NLP应用(7/9):机器翻译与Seq2Seq模型(个人向笔记)

Machine Translation Data 做机器学习任务的第一步都是处理数据&#xff0c;我们首先需要准备机器翻译的数据。由于我们是学习用途&#xff0c;因此拿一个小规模数据集即可&#xff1a;http://www.manythings.org/anki/下面的数据集中&#xff1a;一个英语句子对应多个德语句子…

Spring MVC执行流程

整体流程&#xff1a; 用户向前端控制器发送请求前端控制器接收到请求后调用处理映射器处理器映射器找到具体的处理器&#xff0c;生成处理器对象以及处理器拦截器&#xff0c;再一起返回给前端控制器然后前端控制器调用处理器适配器处理器适配器调用具体的处理器处理器适配器…

element plus el-upload上传组件,自动上传,记录解决:本地报404,文件找不到问题

问题&#xff1a; 解决问题&#xff1a; 重点是&#xff1a;加入action"#"和:http-request"uploadHttpRequest" <el-uploadv-loading"isLoading"ref"upload"v-model"fileList":multiple"multiple"action&quo…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(1)

前言中曾提到&#xff1a;本章重点介绍PCI Express总线的数据链路层与物理层。 PCIe总线的数据链路层处于事务层和物理层之间&#xff0c;主要功能是保证来自事务层的TLP在PCIe链路中的正确传递&#xff0c;为此数据链路层定义了一系列数据链路层报文&#xff0c;即DLLP。数据链…

AI实践与学习8-AI Agent Workflow助力解题和验证答案置信度

背景 之前在试着提高解题正确率&#xff0c;目标100%&#xff0c;发现外部知识不足仅依靠大模型的话比较困难。而试题人工生产成本巨大。 本质因为大模型生成内容会有幻觉特点&#xff0c;也就是说解答的试题正确性不太好评判&#xff0c;直接解答试题生产场景不太可控。 后…