当前位置: 首页 > news >正文

数据结构与算法:贪心(二)

前言

要加快速度啊!!

一、最短无序连续子数组

class Solution {
public:int findUnsortedSubarray(vector<int>& nums) {int n=nums.size();int Max=-1e9;int right=-1;//最右不符合的位置for(int i=0;i<n;i++){if(Max>nums[i])//遇到不符合递增规律的数{right=i;}Max=max(Max,nums[i]);}int Min=1e9;int left=n;//最左不符合的位置for(int i=n-1;i>=0;i--)//从后往前遍历{if(Min<nums[i])//遇到不符合递减规律的数{left=i;}Min=min(Min,nums[i]);}//最左不符合的位置到最优不符合的位置就是需要排序的区域return max(0,right-left+1);}
};

我是伞兵……无穷小的写法是“-1e9”!!

上来这个题的思路就很抽象,因为要抓出一个区间进行排序,而观察递增数组的特点可以发现,如果从前往后遍历,后一个数必然必前一个数大,从后往前遍历的话前一个数也必然比后一个数小。所以思路就是,先从前往后遍历求最大值,当发现不符合递增规律的位置,即最大值更新不了时就记录。接着从后往前遍历求最小值,同样当发现不符合递减规律的位置就记录。所以此时的区间就是不符合递减规律的最左位置到不符合递增规律的最右位置。注意最后要再和0比较一下,即整个数组已经递增,不需要排序。

二、最小区间

class Solution {
public:struct Node{int val;//数值int i;//来自哪一个列表int j;//列表的第几个元素};static bool cmp(const Node&a,const Node&b){return a.val!=b.val?a.val<b.val:a.i<b.i;}vector<int> smallestRange(vector<vector<int>>& nums) {int k=nums.size();set<Node,decltype(&cmp)>s(cmp);for(int i=0;i<k;i++){Node n={nums[i][0],i,0};s.insert(n);}//贪心:区间每次以这k个数的最小值开头,以最大值结尾int len=1e9;//长度int left=0;int right=0;Node Max,Min;while(s.size()==k)//必须时刻保证有k个元素{Max=*s.rbegin();//最大值Min=*s.begin();//最小值s.erase(*s.begin());if(Max.val-Min.val<len)//能更新到更小{len=Max.val-Min.val;left=Min.val;right=Max.val;}if(Min.j+1<nums[Min.i].size())//将最小值的下一个放入{Node n={nums[Min.i][Min.j+1],Min.i,Min.j+1};s.insert(n);}}vector<int>ans={left,right};return ans;}
};

无语了忘了结构体怎么写了……

这个题我感觉cpp会有更快的写法,照搬左老师的java版常数时间太大了……

这个题的贪心思路就是让这个区间每次以这k个数的最小值开头,以最大值结尾,然后每次弹出最小值,把这个最小值所在位置的下一个数加进来,中间统计最短区间长度即可。所以就是设置一个set同时维护最大值和最小值,而因为在弹出时要找到对应的数组和位置,所以往set里存的时候要存一个结构体。

三、组团买票

景区m个项目,第i个项目有两个参数:game[i]={Ki,Bi},Ki、Bi一定是正数。Ki代表折扣系数,Bi代表票价。当有x个人买票时,每张票的价格为Bi-Ki*x,价格大于等于零。单位共有n个人,每人最多可以选一个项目游玩,求需要准备多少钱,可以满足所有选择情况。

1<=m,n,Ki,Bi<=10^5

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;//公园最大收益
int f(int i,int n,int m,vector<vector<int>>&games,vector<int>&cnts)
{if(i==n){int ans=0;for(int j=0,k,b,x;j<m;j++){k=games[j][0];b=games[j][1];x=cnts[j];ans+=max((b-k*x),0);}return ans;}int ans=f(i+1,n,m,games,cnts);//不玩for(int j=0;j<m;j++)//枚举去哪个项目玩{cnts[j]++;ans=max(ans,f(i+1,n,m,games,cnts));cnts[j]--;}return ans;
}//暴力解
int solve1(int n,vector<vector<int>>&games)
{int m=games.size();vector<int>cnts(m);return f(0,n,m,games,cnts);
}//项目
struct Game
{int ki;int bi;int people;
};//项目收益
int earn(int ki,int bi,int x)
{return bi*(x+1)*ki-x*ki;
}static bool cmp(const Game&a,const Game&b)
{return earn(a.ki,a.bi,a.people)>earn(b.ki,b.bi,b.people);
}//正解
int solve2(int n,vector<vector<int>>&games)
{//最保险:公园赚的钱数最大//不同人数x来时,每个项目一共赚若干元钱//将视角转换成,此时再来一个人,该项目总收益的变化//公式:Bi-(x+1)*Ki-x*Ki -&
http://www.lryc.cn/news/579266.html

相关文章:

  • Docker Compose 基础——AI教你学Docker
  • 鸿蒙UI框架深度解析:对比Android/iOS的布局适配与组件设计
  • 优雅草蜻蜓T语音会议系统私有化部署方案与RTC技术深度解析-优雅草卓伊凡|clam
  • 【字节跳动】数据挖掘面试题0002:从转发数据中求原视频用户以及转发的最长深度和二叉排序树指定值
  • gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究
  • 人工智能-基础篇-14-知识库和知识图谱介绍(知识库是基石、知识图谱是增强语义理解的知识库、结构化数据和非结构化数据区分)
  • ubentu服务器版本安装Dify
  • docker拉取redis并使用
  • 代码训练LeetCode(44)螺旋矩阵
  • Notion 创始人 Ivan Zhao:传统软件开发是造桥,AI 开发更像酿酒,提供环境让 AI 自行发展
  • Highcharts 安装使用教程
  • 数据结构20250620_数据结构考试
  • mysql查看数据库
  • IPS防御原理和架构
  • MySQL 用户管理与权限控制
  • Python 的内置函数 print
  • vue动态绑定样式
  • 利用tcp转发搭建私有云笔记
  • (第三篇)HMTL+CSS+JS-新手小白循序渐进案例入门
  • Spring Cloud 微服务(链路追踪与日志聚合)
  • Springboot开发常见注解一览
  • Rust 安装使用教程
  • 【数字后端】- 什么是AOI、OAI cell?它们后面数字的含义
  • 无代码自动化测试工具介绍
  • windows系统下将Docker Desktop安装到除了C盘的其它盘中
  • SpringSSM
  • SQLMesh中的SQL模型:从基础定义到高级应用
  • Python3完全新手小白的学习手册 10 文件和异常
  • C++ 完美转发(泛型模板函数)
  • Python训练营Day1