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

【贪心算法】(第二篇)

时间:2024-10-18 13:22:06浏览次数:8  
标签:return nums int ret strs 算法 序列 第二篇 贪心

目录

最⼤数(medium)

题目解析

讲解算法原理

编写代码

摆动序列(medium)

题目解析

讲解算法原理

编写代码


最⼤数(medium)

题目解析

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

2.题目描述

给定⼀组⾮负整数 nums ,重新排列每个数的顺序(每个数不可拆分)使之组成⼀个最⼤的整数。注意:输出结果可能⾮常⼤,所以你需要返回⼀个字符串⽽不是整数。

⽰例1:
输⼊:nums=[10,2]输出:"210"⽰例2:
输⼊:nums=[3,30,34,5,9]输出:"9534330"
提⽰:
◦ 1 <= nums.length <= 100
◦ 0 <= nums[i] <= 10(9)

讲解算法原理

解法(贪⼼):
可以先优化:

将所有的数字当成字符串处理,那么两个数字之间的拼接操作以及⽐较操作就会很⽅便。贪⼼策略:
按照题⽬的要求,重新定义⼀个新的排序规则,然后排序即可。排序规则:
a. 「A拼接B」⼤于「B拼接A」,那么A在前,B在后;b. 「A拼接B」等于「B拼接A」,那么AB的顺序⽆所谓;c. 「A拼接B」⼩于「B拼接A」,那么B在前,A在后;

编写代码

c++算法代码:

class Solution
{
public:
 string largestNumber(vector<int>& nums) 
 {
 // 优化:把所有的数转化成字符串
 vector<string> strs;
 for(int x : nums) strs.push_back(to_string(x));
 // 排序
 sort(strs.begin(), strs.end(), [](const string& s1, const string& s2)
 {
 return s1 + s2 > s2 + s1;
 });
 // 提取结果
 string ret;
 for(auto& s : strs) ret += s;
 if(ret[0] == '0') return "0";
 return ret;
 }
};

java算法代码:

class Solution
{
 public String largestNumber(int[] nums) 
 {
 // 优化:把所有的数转化成字符串
 int n = nums.length;
 String[] strs = new String[n];
 for(int i = 0; i < n; i++) strs[i] = "" + nums[i];
 // 排序
 Arrays.sort(strs, (a, b) -> 
 {
 return (b + a).compareTo(a + b);
 });
 // 提取结果
 StringBuffer ret = new StringBuffer();
 for(String s : strs) ret.append(s);
 if(ret.charAt(0) == '0') return "0";
 return ret.toString();
 }
}

摆动序列(medium)

题目解析

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

2.题目描述

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第⼀个差(如果存在的话)可能是正数或负数。仅有⼀个元素或者含两个不等元素的序列也视作摆动序列。
• 例如, [1, 7, 4, 9, 2, 5] 是⼀个摆动序列,因为差值 (6, -3, 5, -7, 3) 是正
负交替出现的。
• 相反, [1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第⼀个序列是因为它的
前两个差值都是正数,第⼆个序列是因为它的最后⼀个差值为零。
⼦序列可以通过从原始序列中删除⼀些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你⼀个整数数组 nums ,返回 nums 中作为摆动序列的最⻓⼦序列的⻓度。

⽰例1:
输⼊:nums=[1,7,4,9,2,5]
输出:6
解释:整个序列均为摆动序列,各元素之间的差值为(6,-3,5,-7,3)。⽰例2:
输⼊:nums=[1,17,5,10,13,15,10,5,16,8]
输出:7
解释:这个序列包含⼏个⻓度为7摆动序列。
其中⼀个是[1,17,10,13,10,16,8],各元素之间的差值为(16,-7,3,-3,6,-8)。⽰例3:
输⼊:nums=[1,2,3,4,5,6,7,8,9]
输出:2

提⽰:
• 1 <= nums.length <= 1000
• 0 <= nums[i] <= 1000

讲解算法原理

解法(贪⼼):
贪⼼策略:

对于某⼀个位置来说:
◦ 如果接下来呈现上升趋势的话,我们让其上升到波峰的位置;◦ 如果接下来呈现下降趋势的话,我们让其下降到波⾕的位置。因此,如果把整个数组放在「折线图」中,我们统计出所有的波峰以及波⾕的个数即可。

编写代码

c++算法代码:

class Solution
{
public:
 int wiggleMaxLength(vector<int>& nums) 
 {
 int n = nums.size();
 if(n < 2) return n;
 int ret = 0, left = 0;
 for(int i = 0; i < n - 1; i++)
 {
 int right = nums[i + 1] - nums[i]; // 计算接下来的趋势 if(right == 0) continue; // 如果⽔平,直接跳过
 if(right * left <= 0) ret++; // 累加波峰或者波⾕ left = right; 
 }
 return ret + 1;
 }
};

java算法代码:

class Solution
{
 public int wiggleMaxLength(int[] nums) 
 {
 int n = nums.length;
 if(n < 2) return n;
 int ret = 0, left = 0;
 for(int i = 0; i < n - 1; i++)
 {
 int right = nums[i + 1] - nums[i]; // 计算接下来的趋势 if(right == 0) continue; // 如果⽔平,直接跳过
 if(left * right <= 0) ret++; // 累加波峰或者波⾕ left = right;
 }
 return ret + 1;
 }
}

标签:return,nums,int,ret,strs,算法,序列,第二篇,贪心
From: https://blog.csdn.net/weixin_73861555/article/details/143050735

相关文章

  • 基于Springboot的基于协同过滤算法商品推荐系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的基于协同过滤算法商品推荐系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结......
  • 新闻推荐系统/新闻推送系统/新闻个性化推荐/实时新闻推荐/新闻推荐算法/智能新闻推荐/
    博主介绍......
  • 算法-单调栈
    1.每日温度(LeetCode739)给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。输入:temperatures=[73,74,75,71,69,72,76,73]输出:[1,1,4,......
  • 从组合优化问题建模到贪心法求解以简单调度为例
    此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报所用教材:北京大学屈婉玲教授《算法设计与分析》课程资料:https://www.icourse163.org/course/PKU-1002525003承诺不用于任何商业用途,仅用于学术交流和分享更多内容请关注课题组官方中文主页:https://JaywayXu.github.......
  • 强化学习算法笔记之【Q-learning算法和DQN算法】
    强化学习笔记之【Q-learning算法和DQN算法】前言:强化学习领域,繁冗复杂的大段代码里面,核心的数学公式往往只有20~40行,剩下的代码都是为了应用这些数学公式而服务的这可比遥感图像难太多了,乱七八糟的数学公式看得头大本文初编辑于2024.10.5CSDN主页:https://blog.csdn.net/rvd......
  • 算法与数据结构——桶排序
    桶排序前面的快速排序、归并排序、堆排序等都是属于“基于比较的排序算法”,它们通过比较元素间的大小来实现排序。此类排序算法的时间复杂度无法超越O(nlogn)。下面介绍几种“非比较排序算法”,它们的时间复杂度可以达到线性阶。桶排序(bucketsort)是分治策略的一个典型应用。它通......
  • 八种经典排序算法
    以下是八种经典排序算法的介绍,包括它们的基本思想、时间复杂度、稳定性以及代码示例:1.插入排序基本思想:每步将一个待排序的元素按其关键码值的大小插入到前面已经排序的部分中,直到全部插入完为止。时间复杂度:最坏和平均情况为O(n²),最佳情况为O(n)(当数据基本有序时)。稳定性:......
  • 格点拉格朗日插值与PME算法
    技术背景在前面的一篇博客中,我们介绍了拉格朗日插值法的基本由来和表示形式。这里我们要介绍一种拉格朗日插值法的应用场景:格点拉格朗日插值法。这种场景的优势在于,如果我们要对整个实数空间进行求和或者积分,计算量是随着变量的形状增长的。例如分子动力学模拟中计算静电势能,光是......
  • 传统特征算法——人脸识别
    人脸识别是目前人工智能领域中成熟较早、落地较广的技术之一,广泛应用于手机解锁、支付验证、安防布控等多个领域。其核心在于通过特定的算法识别图像或视频中人脸的身份,这一过程的实现离不开特征算法的支持。以下是对人脸识别特征算法的详细介绍:一、人脸识别系统概述一个......
  • Leetcode刷题. 贪心算法
    贪心算法:    比较传统的解释:将整个问题拆解为几个小问题,找到小问题的最优解,加起来就是整个问题的全局最优解。对于现在的我理解贪心就是一种感觉,给出证明很难,解题思路一般就是认真读题,发掘题目的条件,然后尝试给出算法。11.盛最多水的容器     一个显而易......