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

【贪心算法】(第三篇)

时间:2024-10-19 14:49:27浏览次数:3  
标签:第三篇 nums int 递增 ret 算法 序列 left 贪心

目录

最⻓递增⼦序列(medium)

题目解析

讲解算法原理

编写代码

递增的三元⼦序列(medium)

题目解析

讲解算法原理

编写代码


最⻓递增⼦序列(medium)

题目解析

1.题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/description/

2.题目描述

给你⼀个整数数组 nums ,找到其中最⻓严格递增⼦序列的⻓度。⼦序列是由数组派⽣⽽来的序列,删除(或不删除)数组中的元素⽽不改变其余元素的顺序。例
如, [3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的⼦序列。
⽰例1:
输⼊:nums=[10,9,2,5,3,7,101,18]
输出:4
解释:最⻓递增⼦序列是[2,3,7,101],因此⻓度为4。⽰例2:
输⼊:nums=[0,1,0,3,2,3]
输出:4
⽰例3:
输⼊:nums=[7,7,7,7,7,7,7]
输出:1

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

讲解算法原理

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

我们在考虑最⻓递增⼦序列的⻓度的时候,其实并不关⼼这个序列⻓什么样⼦,我们只是关⼼最后⼀个元素是谁。这样新来⼀个元素之后,我们就可以判断是否可以拼接到它的后⾯。
因此,我们可以创建⼀个数组,统计⻓度为 x 的递增⼦序列中,最后⼀个元素是谁。为了尽可能的让这个序列更⻓,我们仅需统计⻓度为 x 的所有递增序列中最后⼀个元素的「最⼩值」。
统计的过程中发现,数组中的数呈现「递增」趋势,因此可以使⽤「⼆分」来查找插⼊位置。

编写代码

cc++算法代码:

class Solution
{
public:
 int lengthOfLIS(vector<int>& nums) 
 {
 int n = nums.size();
 vector<int> ret;
 ret.push_back(nums[0]);
 for(int i = 1; i < n; i++)
 {
 if(nums[i] > ret.back()) // 如果能接在最后⼀个元素后⾯,直接放 {
 ret.push_back(nums[i]);
 }
 else
 {
 // ⼆分插⼊位置
 int left = 0, right = ret.size() - 1;
 while(left < right)
 {
 int mid = (left + right) >> 1;
 if(ret[mid] < nums[i]) left = mid + 1;
 else right = mid;
 }
 ret[left] = nums[i]; // 放在 left 位置上 }
 }
 return ret.size();
 }
};

java算法代码:

class Solution
{
 public int lengthOfLIS(int[] nums) 
 {
 ArrayList<Integer> ret = new ArrayList<>();
 int n = nums.length;
 ret.add(nums[0]);
 for(int i = 1; i < n; i++)
 {
 if(nums[i] > ret.get(ret.size() - 1)) // 如果能接在最后⼀个元素后⾯,直接放
 {
 ret.add(nums[i]);
 }
 else
 {
 // ⼆分插⼊位置
 int left = 0, right = ret.size() - 1;
 while(left < right)
 {
 int mid = (left + right) / 2;
 if(ret.get(mid) < nums[i]) left = mid + 1;
 else right = mid;
 }
 ret.set(left, nums[i]); // 放在 left 位置上
 }
 }
 return ret.size();
 }
}

递增的三元⼦序列(medium)

题目解析

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

2.题目描述

给你⼀个整数数组 nums ,判断这个数组中是否存在⻓度为 3 的递增⼦序列。
如果存在这样的三元组下标 (i, j, k) 且满⾜ i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。

⽰例1:
输⼊:nums=[1,2,3,4,5]
输出:true
解释:任何i<j<k的三元组都满⾜题意
⽰例2:
输⼊:nums=[5,4,3,2,1]
输出:false
解释:不存在满⾜题意的三元组
⽰例3:
输⼊:nums=[2,1,5,0,4,6]
输出:true
解释:三元组(3,4,5)满⾜题意,因为nums[3]==0<nums[4]==4<nums[5]==6
提⽰:
◦ 1 <= nums.length <= 5 * 10(5)
◦ -2(31) <= nums[i] <= 2(31) - 1

讲解算法原理

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

最⻓递增⼦序列的简化版。
不⽤⼀个数组存数据,仅需两个变量即可。也不⽤⼆分插⼊位置,仅需两次⽐较就可以找到插⼊位置。

编写代码

c++算法代码:

class Solution
{
public:
 bool increasingTriplet(vector<int>& nums) 
 {
 int a = nums[0], b = INT_MAX;
 for(int i = 1; i < nums.size(); i++)
 {
 if(nums[i] > b) return true; 
 else if(nums[i] > a) b = nums[i];
 else a = nums[i];
 }
 return false;
 }
};

java算法代码:

class Solution
{
 public boolean increasingTriplet(int[] nums) 
 {
 int a = nums[0], b = Integer.MAX_VALUE;
 for(int i = 1; i < nums.length; i++)
 {
 if(nums[i] > b) return true;
 else if(nums[i] > a) b = nums[i];
 else a = nums[i];
 }
 return false;
 }
}

标签:第三篇,nums,int,递增,ret,算法,序列,left,贪心
From: https://blog.csdn.net/weixin_73861555/article/details/143050789

相关文章

  • 贪心算法
    贪心算法基本要素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年提出,旨在将一个秘密(如密码、密钥等)分割成多个部分,并分发给不同的参与者。只有当足够数量的参与者(大于等于一个特定的阈值)将他们的份额组合在一起时,秘密才能恢复。少于阈值数量的参与者无法得到任何有用的信息。核心......
  • 【数据结构】分治算法经典: 快速排序详解
    快速排序(Quicksort)是一种高效的排序算法,最早由TonyHoare在1960年提出。它采用了分治(DivideandConquer)策略,平均时间复杂度为O(nlog......