[Algorithm][贪心][K次取反后最大化的数组和][身高排序][优势洗牌][最长回文串]详细讲解

news2024/11/26 4:40:10

目录

  • 1.K 次取反后最大化的数组和
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.身高排序
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.优势洗牌
    • 1.题目链接
    • 2.算法思路详解
    • 3.代码实现
  • 4.最长回文串
    • 1.题目链接
    • 2.代码实现


1.K 次取反后最大化的数组和

1.题目链接

  • K 次取反后最大化的数组和

2.算法原理详解

  • 思路:分情况讨论,设整个数组中负数的个数为m
    • m > k:把前k小负数,转化成正数
    • m == k:把所有的负数转化成正数
    • m < k
      • 先把所有的负数变成正数
      • 讨论k - m的奇偶性
        • 偶数:直接忽略
        • 奇数:挑选当前数组中最小的数,变成负数

3.代码实现

int largestSumAfterKNegations(vector<int>& nums, int k) 
{
    int n = nums.size(), m = 0, minElem = INT_MAX, ret = 0;

    // 求负数个数 & 最小值
    for(const auto& x : nums)
    {
        if(x < 0)
        {
            m++;
        }
        minElem = min(minElem, abs(x));
    }

    // 分类讨论
    if(m > k)
    {
        sort(nums.begin(), nums.end());
        for(int i = 0; i < k; i++)
        {
            ret += -nums[i];
        }

        for(int i = k; i < n; i++)
        {
            ret += nums[i];
        }
    }
    else
    {
        // 把所有负数变成正数
        for(const auto& x : nums)
        {
            ret += abs(x);
        }

        if((k - m) % 2)
        {
            ret -= 2 * minElem;
        }
    }

    return ret;
}

2.身高排序

1.题目链接

  • 身高排序

2.算法原理详解

  • 解法一:创建二元组
    • 创建一个新的数组pair<int, string>
    • 对新的数组排序
    • 按照顺序把名字提取出来即可
  • 解法二:利用哈希表存下映射关系
    • 先用哈希表存下映射关系<身高,名字>
    • 对身高数组排序
    • 根据排序后的结果,在哈希表里面找名字即可
    • 缺点:不可存重复的KEY值
      • 解决方法map<int, string[]>
      • 可以,但仍略显复杂
  • 解法三对下标排序(很常用的方法)
    • 创建一个下标数组
    • 仅需对下标数组排序
    • 根据下标数组排序后的结果,找到原数组的信息
      请添加图片描述

3.代码实现

vector<string> sortPeople(vector<string>& names, vector<int>& heights) 
{
    int n = names.size();
    vector<int> index(n); // 下标数组
    for(int i = 0; i < n; i++)
    {
        index[i] = i;
    }

    // 对下标进行排序
    sort(index.begin(), index.end(), [&](int i, int j)
         {
             return heights[i] > heights[j];
         });

    // 从下标数组取结果
    vector<string> ret;
    for(const auto& x : index)
    {
        ret.push_back(names[x]);
    }

    return ret;
}

3.优势洗牌

1.题目链接

  • 优势洗牌

2.算法思路详解

  • 思路
    • 排序
      • nums1直接排序
      • nums2下标排序 —> 为了不影响原数组的相对顺序
    • 如果比不过,就去拖累对面最强的一个
    • 如果能比过,直接比即可
      请添加图片描述

3.代码实现

vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) 
{
    int n = nums1.size();
    vector<int> index(n);
    for(int i = 0; i < n; i++)
    {
        index[i] = i;
    }

    // 排序
    sort(nums1.begin(), nums1.end());
    sort(index.begin(), index.end(), [&](int i, int j)
         {
             return nums2[i] < nums2[j];
         });

    // 田忌赛马
    vector<int> ret(n);
    int left = 0, right = n - 1;
    for(const auto& x : nums1)
    {
        if(nums2[index[left]] < x)
        {
            ret[index[left++]] = x;
        }
        else
        {
            ret[index[right--]] = x;
        }
    }

    return ret;
}

4.最长回文串

1.题目链接

  • 最长回文串

2.代码实现

int longestPalindrome(string s) 
{
    int hash[128] = {0};
    for(const auto& ch : s)
    {
        hash[ch]++;
    }

    int ret = 0;
    for(const auto& x : hash)
    {
        ret += x / 2 * 2; // 奇偶混合处理
    }

    return ret < s.size() ? ret + 1 : ret;
}

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

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

相关文章

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf)&#xff0c;也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

Ms08067安全实验室成功实施多家业务系统渗透测试项目

点击星标&#xff0c;即时接收最新推文 近日&#xff0c;Ms08067安全实验室针对多家公司重要系统实施渗透测试项目。公司网络信息系统的业务应用和存储的重要信息资产均较多&#xff0c;存在网络系统结构的复杂性和庞杂等特点&#xff0c;使得公司网络信息系统面临一定风险。项…

如何打开pak文件-翻译pak语言包

最近碰到一些程序的语言包是pak格式&#xff0c;用Notepad打开全是乱码&#xff0c;百度搜索了一下&#xff0c;pak是一种少见的压缩文件格式&#xff0c;是pak Quake系列游戏所采用的一种特殊压缩包格式&#xff0c;由Quake游戏公司开发&#xff0c;用高版本的winrar可以打开&…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电&#xff0c;高压上电流程一般理解为高压件通电的过程&#xff0c;具体流程如下&#xff1a; 1、点火开关处于ON档时&#xff0c;仪表盘点亮&#xff0c;低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

【因果推断python】38_预测模型1

目录 工业界中的机器学习 之前的部分涵盖了因果推理的核心。那里的技术是众所周知和成熟的。他们经受住了时间的考验。第一部分建立了我们可以依赖的坚实基础。用更专业的术语来说&#xff0c;第一部分侧重于定义什么是因果推理&#xff0c;哪些偏差会阻止相关性成为因果关系&…

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析&#xff1a; 由于代码太多我们只解析主函数&#xff0c;&#xff08;其他封装函数见前面文章&#xff0c;同时用到了解码编码封装代码&#xff09;。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…

[Vulnhub]Wintermute LFI+SMTP+Screen+Structv2-RCE+Lxc逃逸

概要 靶机 192.168.8.104 信息收集 $ nmap 192.168.8.103 --min-rate 1000 -sC -sV 结果: Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-15 05:54 EDT Nmap scan report for 192.168.8.103 (192.168.8.103) Host is up (0.035s latency). Not shown: 997 closed t…

docker 简单在线安装教程

1、配置阿里镜像源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 2、指定版本安装docker 本次制定安装 docker 服务版本、客户端版本都为&#xff1a; 19.03.14-3.el7 yum -y install docker-ce-19.03.14-3.e…

动态规划的递归写法和递推写法详解

目录 动态规划的概念 动态规划的递归写法 动态规划的递推写法 动态规划的概念 动态规划是一种用来解决一类最优化问题的算法思想。简单来说&#xff0c;动态规划将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解来得到原问题的最优解。需要注意的是&…

论文阅读笔记:Towards Higher Ranks via Adversarial Weight Pruning

论文阅读笔记&#xff1a;Towards Higher Ranks via Adversarial Weight Pruning 1 背景2 创新点3 方法4 模块4.1 问题表述4.2 分析高稀疏度下的权重剪枝4.3 通过SVD进行低秩逼近4.4 保持秩的对抗优化4.5 渐进式剪枝框架 5 效果5.1 和SOTA方法对比5.2 消融实验5.3 开销分析 6 结…

秋招突击——6/14——复习{(树形DP)树的最长路径,(单调队列优化DP)——最大子序和}——新作{四数之和}

文章目录 引言复习树形DP——树的最长路径实现代码答疑 单调队列优化DP——最大子序和个人实现思路参考思路分析实现代码 无重复最长字串思路分析实现代码 新作四数之和实现思路需要注意的问题 参考代码分析思路实现代码 总结 引言 今天好好看看树的最长的路径&#xff0c;自己…

《Deep learning practice》learning notes

学习笔记&#xff1a; 【公开课】旷视x北大《深度学习实践》&#xff08;28课时全&#xff09; R Talk | 旷视科技目标检测概述&#xff1a;Beyond RetinaNet and Mask R-CNN 文章目录 Lecture 1: Introduction to Computer Vision and Deep Learning&#xff08;孙剑&#x…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说&#xff0c;做了以下事情&#xff1a; ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源&#xff0c;并下载最新的软件包列表。 ③将…

1832javaERP管理系统之车间计划管理Myeclipse开发mysql数据库servlet结构java编程计算机网页项目

一、源码特点 java erp管理系统之车间计划管理是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了serlvet设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

欧洲杯赛况@20240615

点击标题下「蓝色微信名」可快速关注 欧洲杯首战&#xff0c;德国5:1狂胜苏格兰&#xff0c;大比分、红点套餐、超新星登场进球&#xff0c;好像这些能想到的元素都发挥了作用&#xff0c;作为东道主&#xff0c;聚集了天时地利人和&#xff0c;可以说是完美&#xff0c;这就是…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

21. 第21章 算法分析

21. 算法分析 这个附录选自OReilly Media出版的Alen B.Downey的Think Complexity(2012)一书. 当你读完本书之后, 可能会像继续读读那本书.算法分析是计算机科学的一个分支, 研究算法的性能, 尤其是他们的运行时间和空间需求. 参见http://en.wikipedia.org/wiki/Analysis_of_al…

Mac M3 Pro安装Hadoop-3.3.6

1、下载Hadoop安装包 可以到官方网站下载&#xff0c;也可以使用网盘下载 官网下载地址&#xff1a;Hadoop官网下载地址 网盘地址&#xff1a;https://pan.baidu.com/s/1p4BXq2mvby2B76lmpiEjnA?pwdr62r提取码: r62r 2、解压并添加环境变量 # 将安装包移动到指定目录 mv …

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-ESN基于灰狼算法优化回声状态…

学习前端第一关

作者&#xff1a;周棋洛 文章目录 前言超文本标记语言&#xff1f;编辑器推荐手刃一个网页&#xff0c;Hello World&#xff01;网页骨架讲解标签学习HTML标题HTML段落HTML换行HTML居中HTML水平线HTML格式化HTML注释HTML链接 前言 网站并不是多么复杂的技术&#xff0c;今天这…