首页 > 编程语言 >【贪心算法】(第六篇)

【贪心算法】(第六篇)

时间:2024-10-21 12:48:04浏览次数:13  
标签:int ret heights 算法 names 第六篇 nums1 nums2 贪心

目录

按⾝⾼排序(easy)

题目解析

讲解算法原理

编写代码

优势洗牌(⽥忌赛⻢)(medium)

题目解析

讲解算法原理

编写代码


按⾝⾼排序(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个字符串数组 names ,和⼀个由互不相同的正整数组成的数组 heights 。两个数组的⻓度均为 n 。
对于每个下标 i , names[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。

提⽰:
◦ n == names.length == heights.length
◦ 1 <= n <= 10(3)
◦ 1 <= names[i].length <= 20
◦ 1 <= heights[i] <= 10(5)
◦ names[i] 由⼤⼩写英⽂字⺟组成
◦ heights 中的所有值互不相同

讲解算法原理

解法(通过排序''索引''的⽅式):
算法思路:

我们不能直接按照 i 位置对应的 heights 来排序,因为排序过程是会移动元素的,但是
names 内的元素是不会移动的。
由题意可知, names 数组和 heights 数组的下标是⼀⼀对应的,因此我们可以重新创建出来⼀个下标数组,将这个下标数组按照 heights[i] 的⼤⼩排序。
那么,当下标数组排完序之后,⾥⾯的顺序就相当于 heights 这个数组排完序之后的下标。之后通过排序后的下标,依次找到原来的 name ,完成对名字的排序。

编写代码

c++算法代码:

class Solution
{
public:
 vector<string> sortPeople(vector<string>& names, vector<int>& heights) 
 {
 // 1. 创建⼀个下标数组
 int n = names.size();
 vector<int> index(n);
 for(int i = 0; i < n; i++) index[i] = i;
 // 2. 对下标进⾏排序
 sort(index.begin(), index.end(), [&](int i, int j)
 {
 return heights[i] > heights[j];
 });
 // 3. 提取结果
 vector<string> ret;
 for(int i : index)
 {
 ret.push_back(names[i]);
 }
 return ret;
 }
};

java算法代码:

class Solution
{
 public String[] sortPeople(String[] names, int[] heights) 
 {
 // 1. 创建⼀个下标数组
 int n = names.length;
 Integer[] index = new Integer[n];
 for(int i = 0; i < n; i++) index[i] = i;
 // 2. 对下标数组排序
 Arrays.sort(index, (i, j) -> 
 {
 return heights[j] - heights[i];
 });
 // 3. 提取结果
 String[] ret = new String[n];
 for(int i = 0; i < n; i++)
 {
 ret[i] = names[index[i]];
 }
 return ret;
 }
}

优势洗牌(⽥忌赛⻢)(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

注意注意注意!!!
做这道题之前建议先把2418.按⾝⾼排序⾥⾯,通过排序数组下标,进⽽不改变原数组顺序的排序技巧好好吸收消化掉。不然⾥⾯变量众多,很容易犯迷。

2.题目解析

给定两个⻓度相等的数组 nums1 和 nums2 , nums1 相对于 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]

提⽰:
◦ 1 <= nums1.length <= 10(5)
◦ nums2.length == nums1.length
◦ 0 <= nums1[i], nums2[i] <= 10(9)

讲解算法原理

解法(贪⼼):
讲⼀下⽥忌赛⻢背后包含的博弈论和贪⼼策略:

⽥忌赛⻢没听过的⾃⾏百度,这⾥讲⼀下⽥忌赛⻢背后的博弈决策,从三匹⻢拓展到 n 匹⻢之间博弈的最优策略。
⽥忌:下等⻢中等⻢上等⻢
⻬王:下等⻢中等⻢上等⻢
a. ⽥忌的下等⻢ pk 不过⻬王的下等⻢,因此把这匹⻢丢去消耗⼀个⻬王的最强战⻢!b. 接下来选择中等⻢ pk ⻬王的下等⻢,勉强获胜;
c. 最后⽤上等⻢ pk ⻬王的中等⻢,勉强获胜。
由此,我们可以得出⼀个最优的决策⽅式:
a. 当⼰⽅此时最差的⽐不过对⾯最差的时候,让我⽅最差的去处理掉对⾯最好的(反正要输,不
如去拖掉对⾯⼀个最强的);
b. 当⼰⽅此时
c. 最差的能⽐得上对⾯最差的时候,就让两者⽐对下去(最差的都能获胜,为什么要输呢)。每次决策,都会使我⽅处于优势。

编写代码

c++算法代码:

class Solution
{
public:
 vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) 
 {
 int n = nums1.size();
 // 1. 排序
 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];
 });
 // 2. ⽥忌赛⻢
 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;
 }
};

java算法代码:

class Solution
{
 public int[] advantageCount(int[] nums1, int[] nums2) 
 {
 int n = nums1.length;
 // 1. 排序
 Arrays.sort(nums1);
 Integer[] index2 = new Integer[n];
 for(int i = 0; i < n; i++) index2[i] = i;
 Arrays.sort(index2, (i, j) -> 
 {
 return nums2[i] - nums2[j];
 });
 // 2. ⽥忌赛⻢
 int[] ret = new int[n];
 int left = 0, right = n - 1;
 for(int x : nums1)
 {
 if(x > nums2[index2[left]])
 {
 ret[index2[left++]] = x;
 }
 else
 {
 ret[index2[right--]] = x;
 }
 }
 return ret;
 }
}

标签:int,ret,heights,算法,names,第六篇,nums1,nums2,贪心
From: https://blog.csdn.net/weixin_73861555/article/details/143109302

相关文章

  • 算法比赛中常用的快读
    在算法比赛中,快读是一个常用的技巧,用于提高输入数据的速度。常见的快读方法有以下几种:1.C++中的快读C++中常用scanf和getchar进行快读。#include<cstdio>#include<cstring>inlineintread(){intx=0,f=1;charc=getchar();while(c<'0'......
  • Python 自编码器(Autoencoder)算法详解与应用案例
    目录Python自编码器(Autoencoder)算法详解与应用案例引言一、自编码器的基本原理1.1自编码器的结构1.2自编码器的类型二、Python中自编码器的面向对象实现2.1`Autoencoder`类的实现2.2`Trainer`类的实现2.3`DataLoader`类的实现三、案例分析3.1手写数字去噪自......
  • Python Bagging算法详解与应用案例
    这里写目录标题PythonBagging算法详解与应用案例引言一、Bagging的基本原理1.1Bagging的概念1.2Bagging的步骤1.3Bagging的优势与挑战二、Python中Bagging的面向对象实现2.1`DecisionTree`类的实现2.2`Bagging`类的实现2.3`Trainer`类的实现三、案例分析3.1......
  • 普通人,适合做算法吗?大语言模型有未来吗?
    直接说结论:目前来说,算法领域不适合,但是大语言模型工程可以!发展背景AI发展的几个阶段,统计、算法策略、机器学习、深度学习和大语言模型在2013~2014年的时候,岗位极度稀缺,大厂也是非常需要。所以背景显得没那么重要了。到了2015年~2020年,机器学习相关的培训课程和学校教学,......
  • 最强总结!十大回归类算法模型 !!!
     【转载】 最强总结!十大回归类算法模型!!! 今儿和大家分享的回归类算法有:线性回归Ridge回归Lasso回归弹性网络回归多项式回归决策树回归随机森林回归支持向量回归K近邻回归梯度提升回归1.线性回归线性回归是一种用于描述两个或多个变量......
  • 泥石流山体滑坡监控AI视觉识别检测算法
    泥石流山体滑坡监控AI视觉识别检测算法基于AI视觉识别技术,泥石流山体滑坡监控AI视觉识别检测算法通过监控摄像头采集到的图像和视频流,利用先进的视觉识别算法分析和判断监控画面中是否出现泥石流和山体滑坡现象。泥石流山体滑坡监控AI视觉识别检测算法一旦系统识别到灾害事件的发......
  • 支持国密算法的数字证书-国密SSL证书详解
    在互联网中,数字证书作为标志通讯各方身份信息的数字认证而存在,常见的数字证书大都采用国际算法,比如RSA算法、ECC算法、SHA2算法等。随着我国加强网络安全技术自主可控的大趋势,也出现了支持国密算法的数字证书-国密SSL证书。那么什么是国密SSL证书?国密SSL证书支持哪种国密算法呢......
  • 【关联规则挖掘算法‌】基于兴趣度的关联规则挖掘算法
    目录一、基于兴趣度的关联规则挖掘算法概述1.1兴趣度度量1.2基于兴趣度的关联规则挖掘算法1.2.1支持度-置信度(SC)算法1.2.2支持度-提升度(SP)算法1.2.3支持度-互信息(SM)算法1.2.4基于兴趣度的关联规则挖掘算法二、基于兴趣度的关联规则挖掘算法优缺点和改进2.1  ......
  • 【关联规则挖掘算法‌】基于约束的关联规则挖掘算法
    目录一、基于约束的关联规则挖掘算法概述二、基于约束的关联规则挖掘算法优缺点和改进2.1  基于约束的关联规则挖掘算法优点2.2  基于约束的关联规则挖掘算法缺点2.3  基于约束的关联规则挖掘算法改进三、 基于约束的关联规则挖掘算法编程实现3.1  基于约束的......
  • 人脸识别-特征算法
    文章目录一、LBPH算法1.基本原理2.实现步骤3.代码实现二、Eigenfaces算法1.特点2.代码实习三、FisherFaces算法1.算法原理2.算法特点3.代码实现四、总结人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段,从人脸图像中......