贪心算法(4)

news/2024/9/28 4:29:48/

题一.K次取反后最大化的数组和(LeetCode)

题目描述

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

题目分析

由于我们希望数组的和尽可能大,因此除非万不得已,我们应当总是修改负数,并且优先修改值最小的负数。因为将负数 −x 修改成 x 会使得数组的和增加 2x,所以这样的贪心操作是最优的。

题解 

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {int m = 0;int ret = 0;for (auto x : nums){if (x < 0) m++;}sort(nums.begin(), nums.end());if (k > m){for (int i = 0; i < m; i++){nums[i] *= -1;}sort(nums.begin(), nums.end());for (int i = 0; i < k - m; i++){nums[0] *= -1;}}else{for (int i = 0; i < k; i++){nums[i] *= -1;}}for (auto x : nums){ret += x;}return ret;}
};

题二.按身高排序(LeetCode)

题目描述

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。

对于每个下标 inames[i] 和 heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names 。

示例 1:

输入:names = ["Mary","John","Emma"], heights = [180,165,170]
输出:["Mary","Emma","John"]
解释:Mary 最高,接着是 Emma 和 John 。


示例 2:

输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出:["Bob","Alice","Bob"]
解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。

题解一.哈希表

class Solution1 {
public:vector<string> sortPeople(vector<string>& names, vector<int>& heights) {map<int, string> hash;vector<string> ans;for (int i = 0; i < names.size(); ++i) hash[heights[i]] = names[i];for (auto &i : hash) ans.push_back(i.second);reverse(ans.begin(), ans.end());return ans;}
};

*题解二.对下标排序

1.创建一个下标数组。

2.仅需对下标数组排序。

3.根据下标数组排序后的结果,找到原数组的信息。

class Solution2 {
public: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 (int i : index){ret.push_back(names[i]);}return ret;}
};

**题三.优势洗牌(LeetCode)

题目描述

给定两个长度相等的数组 nums1 和 nums2nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。

返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。

示例 1:

输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]

示例 2:

输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]

题目分析

先把nums1从小到大排序,并把nums2下标排序(因为需要num2原数组的信息)
然后将nums1与nums2比较,采用left、right双指针进行比较。

  • 比不过,就去拖累最大的一个。
  • 能比过,则直接比 

需要注意的是,nums2的调用方式 nums2[index2[i]]。

题解 

class Solution {
public:vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {int n=nums1.size();sort(nums1.begin(),nums1.end());vector<int> index2(n);for(int i=0;i<n;i++) index2[i]=i;sort(index2.begin(),index2.end(),[&](int i,int j){return nums2[i]<nums2[j];});vector<int> ret(n);int left=0,right=n-1;for(auto x : nums1){if(x>nums2[index2[left]]) ret[index2[left++]]=x;else ret[index2[right--]]=x;}return ret;}
};

http://www.ppmy.cn/news/1530928.html

相关文章

MATLAB基于传统方法的车道线检测实现

MATLAB基于传统方法的车道线检测实现 本文实现的是基于传统方法的车道线检测&#xff0c;所谓传统方法就是没有涉及到深度学习算法&#xff0c;基于直观的手段和数学知识来实现&#xff0c;后期会实现基于深度学习的车道线检测方法。 实现步骤&#xff1a; Canny边缘检测手动…

如何使用 maxwell 同步到 redis?

文章目录 1、MaxwellListener2、MxwObject1. 使用Maxwell捕获MySQL变更2. 将Maxwell的输出连接到消息系统3. 从消息系统读取数据并同步到Redis注意事项 1、MaxwellListener package com.atguigu.tingshu.album.listener;import com.alibaba.fastjson.JSON; import org.apache.…

从静态多态、动态多态到虚函数表、虚函数指针

多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许不同类的对象对同一消息做出不同的响应。多态性使得可以使用统一的接口来操作不同类的对象&#xff0c;从而提高了代码的灵活性和可扩展性。 一、多态的表现形式 1. 静态多态&…

吉林大学微机接口实验五:D/A转换

1.实验内容 2.实验原理/预备知识 D/A转换器TLC7528是关键&#xff0c;其用法参见&#xff1a; 芯片部件汇总&#xff1a;常用功能部件大全-CSDN博客 直接找"TLC7528 D/A数模转换器"&#xff08;实际上学校的讲义已经讲的很清楚&#xff0c;我只是给搬到了博客里&…

对网页聊天项目进行性能测试, 使用JMeter对于基于WebSocket开发的webChat项目的聊天功能进行测试

登录功能 包括接口的设置和csv文件配置 ​​​​​​ 这里csv文件就是使用xlsx保存数据, 然后在浏览器找个网址转成csv文件 注册功能 这里因为需要每次注册的账号不能相同, 所以用了时间函数来当用户名, 保证尽可能的给正确的注册数据, 时间函数使用方法如下 这里输入分钟, 秒…

VMware虚拟机Centos操作系统——配置docker,运行本地打包的镜像,进入conda环境(vmware,docker新手小白)

1.docker-centos运行sudo yum install -y yum-utils报错 遇到问题 解决&#xff1a; 进入/etc/yum.repos.d目录下找到 CentOS-Base.repo&#xff0c;执行下面两个命令&#xff1a; cp CentOS-Base.repo CentOS-Base.repo.backupvi CentOS-Base.repo 进入后改成&#x…

Redis中String命令的基础操作

文章目录 Redis中String命令的基础操作一、引言二、String类型的基础命令1、设置与获取值1.1、SET命令1.2、GET命令 2、字符串操作2.1、APPEND命令2.2、GETRANGE命令2.3、SETRANGE命令2.4、STRLEN命令 3、数值操作3.1、INCR命令3.2、DECR命令3.3、INCRBY和DECRBY命令 三、应用场…

ESP32-WROOM-32 [ESP连接路由器+TCP Client 透传 + TCP Server数据发送]

简介 基于前两篇 ESP32-WROOM-32 [创建AP站点-客户端-TCP透传] ESP32-WROOM-32 [创建AP站点-TCP服务端-数据收发] 介绍一下连接路由器的方式, 然后参考前两篇设置为Client或者Server, 进行数据传输即可&#xff1b; 指令介绍 注意,下面指令需要在最后加上CRLF, 也就是\r\n(回…