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

【贪心算法】(第四篇)

时间:2024-10-19 14:49:48浏览次数:3  
标签:prevMin nums int ret 序列 算法 prices 第四篇 贪心

目录

最⻓连续递增序列(easy)

题目解析

讲解算法原理

编写代码

买卖股票的最佳时机(easy)

题目解析

讲解算法原理

编写代码


最⻓连续递增序列(easy)

题目解析

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

2.题目描述

给定⼀个未经排序的整数数组,找到最⻓且连续递增的⼦序列,并返回该序列的⻓度。
连续递增的⼦序列可以由两个下标 l 和 r ( l < r )确定,如果对于每个 l <= i < r ,都有 nums[i] < nums[i + 1] ,那么⼦序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增⼦序列。

⽰例1:
输⼊:nums=[1,3,5,4,7]
输出:3
解释:最⻓连续递增序列是[1,3,5],⻓度为3。
尽管[1,3,5,7]也是升序的⼦序列,但它不是连续的,因为5和7在原数组⾥被4隔开。
⽰例2:
输⼊:nums=[2,2,2,2,2]
输出:1
解释:最⻓连续递增序列是[2],⻓度为1。

提⽰:
◦ 1 <= nums.length <= 10(4)
◦ -10(9) <= nums[i] <= 10(9)

讲解算法原理

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

找到以某个位置为起点的最⻓连续递增序列之后(设这个序列的末尾为 j 位置),接下来直接以 j + 1 的位置为起点寻找下⼀个最⻓连续递增序列。

编写代码

c++算法代码:

class Solution
{
public:
 int findLengthOfLCIS(vector<int>& nums) 
 {
 int ret = 0, n = nums.size();
 for(int i = 0; i < n; )
 {
 int j = i + 1;
 // 找到递增区间的末端
 while(j < n && nums[j] > nums[j - 1]) j++;
 ret = max(ret, j - i);
 i = j; // 直接在循环中更新下⼀个位置的起点 }
 return ret;
 }
};

java算法代码:

class Solution
{
 public int findLengthOfLCIS(int[] nums) 
 {
 int ret = 0, n = nums.length;
 for(int i = 0; i < n; )
 {
 int j = i + 1;
 // 找到递增区间的末端
 while(j < n && nums[j] > nums[j - 1]) j++;
 ret = Math.max(ret, j - i);
 i = j; // 循环内部直接更新下⼀个位置的起点 - 贪⼼ }
 return ret;
 }
}

买卖股票的最佳时机(easy)

题目解析

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

2.题目描述

给定⼀个数组 prices ,它的第 i 个元素 prices[i] 表⽰⼀⽀给定股票第 i 天的价格。你只能选择某⼀天买⼊这只股票,并选择在未来的某⼀个不同的⽇⼦卖出该股票。设计⼀个算法来
计算你所能获取的最⼤利润。
返回你可以从这笔交易中获取的最⼤利润。如果你不能获取任何利润,返回 0 。
⽰例1:
输⼊:[7,1,5,3,6,4]
输出:5
解释:在第2天(股票价格=1)的时候买⼊,在第5天(股票价格=6)的时候卖出,最⼤利润=6-1=5。
注意利润不能是7-1=6,因为卖出价格需要⼤于买⼊价格;同时,你不能在买⼊前卖出股票。⽰例2:
输⼊:prices=[7,6,4,3,1]
输出:0
解释:在这种情况下,没有交易完成,所以最⼤利润为0。

提⽰:
◦ 1 <= prices.length <= 10(5)
◦ 0 <= prices[i] <= 10(4)

讲解算法原理

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

由于只能交易⼀次,所以对于某⼀个位置 i ,要想获得最⼤利润,仅需知道前⾯所有元素的最⼩值。然后在最⼩值的位置「买⼊」股票,在当前位置「卖出」股票即可。

编写代码

c++算法代码:

class Solution
{
public:
 int maxProfit(vector<int>& prices) 
 {
 int ret = 0; // 记录最终结果
 for(int i = 0, prevMin = INT_MAX; i < prices.size(); i++)
 {
 ret = max(ret, prices[i] - prevMin); // 先更新结果
 prevMin = min(prevMin, prices[i]); // 再更新最⼩值
 }
 return ret;
 }
};

java算法代码:

class Solution
{
 public int maxProfit(int[] prices) 
 {
 int ret = 0; // 记录最终结果
 for(int i = 0, prevMin = Integer.MAX_VALUE; i < prices.length; i++)
 { 
 ret = Math.max(ret, prices[i] - prevMin); // 先更新结果
 prevMin = Math.min(prevMin, prices[i]); // 再更新最⼩值
 }
 return ret;
 }
}

标签:prevMin,nums,int,ret,序列,算法,prices,第四篇,贪心
From: https://blog.csdn.net/weixin_73861555/article/details/143050876

相关文章

  • 【贪心算法】(第三篇)
    目录最⻓递增⼦序列(medium)题目解析讲解算法原理编写代码递增的三元⼦序列(medium)题目解析讲解算法原理编写代码最⻓递增⼦序列(medium)题目解析1.题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/2.题目描述给你⼀个整数数组......
  • 贪心算法
    贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个子问题,每个子问......
  • 贪心算法
    贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个子问题,每个子问......
  • 贪心算法
    贪心算法 贪心算法基本要素1.贪心选择性质:通过每个子问题的最优选择,可以得到整个问题的最优解。意味着,当我们面对一个问题时,我们就可以通过贪心策略来做出局部最优的选择,最终得到全局最优的解。2.最优子结构:问题的最优解包含子问题的最优解。意味着,问题可以分解成若干个......
  • 数据结构与算法之线性表的基本操作
    数据结构之线性表的基本操作初始化,插入,获取#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineOK1#defineOVERFLOW-1#defineLIST_INIT_SIZE100#defineLISTINCREMENT10typedefintElemType;typedefstruct{ ElemType*elem; intlength; i......
  • YU_C++算法学习笔记 · 枚举
    1.1枚举类问题·枚举是什么?枚举也叫穷举,是计算机解决问题最基本的策略。其方法是一一列举所有的可能性,根据题意要求进行合理的判断或计算,最终得到答案,本质上就是一种搜索算法基础的枚举就是人们常说的“暴力”求解。对于不同的问题,不可过分依赖“暴力”求解,应该根据具体的......
  • 鲸鱼优化算法+深度学习+注意力机制!WOA-CNN-LSTM-MATT多特征分类预测
    鲸鱼优化算法+深度学习+注意力机制!WOA-CNN-LSTM-MATT多特征分类预测目录鲸鱼优化算法+深度学习+注意力机制!WOA-CNN-LSTM-MATT多特征分类预测分类效果基本介绍程序设计参考资料分类效果基本介绍1.Matlab实现WOA-CNN-LSTM-MATT鲸鱼算法优化卷积神经网络-长......
  • 足球预测大小球及让球-AI智能大数据算法软件:教你如何准确预测足球赛事
    一、引言在足球领域,预测比赛结果一直是球迷和专业人士关注的焦点。而有些人能在足球预测领域混的风生水起,更多的人则是难以准确分析足球比赛,这种现象的原因在于数据信息的不对等,足球预测归根结底是基于数据信息的推论,普通人没有专业的分析团队,缺乏合适的预测工具,往往就难以准......
  • UOJ 80:二分图最大权匹配 ← KM算法
    【KM算法简介】Kuhn-Munkres算法,简称KM算法,是用于“二分图带权最大匹配问题”的经典算法。【题目来源】https://uoj.ac/problem/80【题目描述】从前一个和谐的班级,有nl个是男生,有nr个是女生。编号分别为1,……,nl和1,……,nr。有若干个这样的条件:第v个男生......
  • 基于拉格朗日插值多项式的Shamir's Secret Sharing 加密算法
    Shamir'sSecretSharing是一种加密算法,由AdiShamir于1979年提出,旨在将一个秘密(如密码、密钥等)分割成多个部分,并分发给不同的参与者。只有当足够数量的参与者(大于等于一个特定的阈值)将他们的份额组合在一起时,秘密才能恢复。少于阈值数量的参与者无法得到任何有用的信息。核心......