【Leetcode Sheet】Weekly Practice 10

Leetcode Test

123 买卖股票的最佳时机Ⅲ(10.3)

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 105

【动态规划】

int maxProfit(int* prices, int pricesSize){//buy1: buy once//sell1: buy once & sell once//buy2: buy twice & sell once//sell2: buy twice & sell twice//buy1[i] = max(buy1[i-1], -prices[i])//sell1[i] = max(sell1[i-1], buy1[i-1]+prices[i])//buy2[i] = max(buy2[i], sell1[i]-prices[i])//sell2[i] = max(sell2[i], buy2[i-1]+prices[i])//buy1[0]=-prices[0] 同一天买//sell1[0]=0 同一天买+卖//buy2[0]=-princes[0] 同一天买+卖+买//sell2[0]=0 同一天买+卖+买+卖int buy1=-prices[0],sell1=0;int buy2=buy1,sell2=sell1;for(int i=1;i<pricesSize;i++){buy1=fmax(buy1,-prices[i]);sell1=fmax(sell1,buy1+prices[i]);buy2=fmax(buy2,sell1-prices[i]);sell2=fmax(sell2,buy2+prices[i]);}return sell2;
}

188 买卖股票的最佳时机Ⅳ(10.4)

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

提示:

  • 1 <= k <= 100
  • 1 <= prices.length <= 1000
  • 0 <= prices[i] <= 1000

【动态规划】universal version

int maxProfit(int k, int* prices, int pricesSize){int n=pricesSize;int f[k+2][2];//[0]代表sell,[1]代表buymemset(f,-0x3f,sizeof(f));for(int j=1;j<k+2;j++){f[j][0]=0;//先把sell全部赋值为0}for(int i=0;i<n;i++){for(int j=1;j<k+2;j++){f[j][0]=fmax(f[j][0],f[j][1]+prices[i]);f[j][1]=fmax(f[j][1],f[j-1][0]-prices[i]);}}return f[k+1][0];
}

309 买卖股票的最佳时机含冷冻期(10.5)

给定一个整数数组prices,其中第 prices[i] 表示第 *i* 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

【动态规划】

int maxProfit(int* prices, int pricesSize){//0:手里有票,今天可以卖//1:前一天冻结,今天不能买//2:手里没票,今天可以买int n=pricesSize;int f[n][3];f[0][0]=-prices[0];f[0][1]=f[0][2]=0;for(int i=1;i<n;i++){f[i][0]=fmax(f[i-1][0],f[i-1][2]-prices[i]);//i-1天有票,或i-1天没票时买了票f[i][1]=f[i-1][0]+prices[i];//一定是i-1天买了票,所以i天才会冻结f[i][2]=fmax(f[i-1][2],f[i-1][1]);//i-1天没票,或冻结期刚结束}return fmax(f[n-1][2],f[n-1][1]);//返回最后一天手里没票,或最后一天在冻结期
}

714 买卖股票的最佳时机含手续费(10.6)

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

提示:

  • 1 <= prices.length <= 5 * 104
  • 1 <= prices[i] < 5 * 104
  • 0 <= fee < 5 * 104

【动态规划】

int maxProfit(int* prices, int pricesSize, int fee){int n=pricesSize;int f[n+1][2];memset(f,0,sizeof(f));f[0][1]=INT_MIN/2;for(int i=0;i<n;i++){f[i+1][0]=fmax(f[i][0],f[i][1]+prices[i]-fee);f[i+1][1]=fmax(f[i][1],f[i][0]-prices[i]);}return f[n][0];
}

901 股票价格跨度(10.7)

设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度

当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。

  • 例如,如果未来 7 天股票的价格是 [100,80,60,70,60,75,85],那么股票跨度将是 [1,1,1,2,1,4,6]

实现 StockSpanner 类:

  • StockSpanner() 初始化类对象。
  • int next(int price) 给出今天的股价 price ,返回该股票当日价格的 跨度

提示:

  • 1 <= price <= 105
  • 最多调用 next 方法 104

【单调栈】(这东西还是cpp好用…)

class StockSpanner {stack<pair<int, int>> st;int cur_day = -1; // 第一个 next 调用算作第 0 天
public:StockSpanner() {st.emplace(-1, INT_MAX); // 这样无需判断栈为空的情况}int next(int price) {while (price >= st.top().second) {st.pop(); // 栈顶数据后面不会再用到了,因为 price 更大}int ans = ++cur_day - st.top().first;st.emplace(cur_day, price);return ans;}
};/*** Your StockSpanner object will be instantiated and called as such:* StockSpanner* obj = new StockSpanner();* int param_1 = obj->next(price);*/

2034 股票价格波动(10.8)

给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格

不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。

请你设计一个算法,实现:

  • 更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
  • 找到当前记录里 最新股票价格最新股票价格 定义为时间戳最晚的股票价格。
  • 找到当前记录里股票的 最高价格
  • 找到当前记录里股票的 最低价格

请你实现 StockPrice 类:

  • StockPrice() 初始化对象,当前无股票价格记录。
  • void update(int timestamp, int price) 在时间点 timestamp 更新股票价格为 price
  • int current() 返回股票 最新价格
  • int maximum() 返回股票 最高价格
  • int minimum() 返回股票 最低价格

提示:

  • 1 <= timestamp, price <= 109
  • updatecurrentmaximumminimum 调用次数不超过 105
  • currentmaximumminimum 被调用时,update 操作 至少 已经被调用过 一次

【hash + 有序集合】

class StockPrice {int maxTimestamp;unordered_map<int,int> timePriceMap;multiset<int> prices;
public:StockPrice() {this->maxTimestamp=0;//初始化对象,当前无股票价格记录}void update(int timestamp, int price) {//在时间点 `timestamp` 更新股票价格为 `price`maxTimestamp=max(maxTimestamp,timestamp);int prevPrice=timePriceMap.count(timestamp) ? timePriceMap[timestamp] : 0;//上次的价格timePriceMap[timestamp]=price;//这次的价格if(prevPrice>0){//如果有上次的auto it=prices.find(prevPrice);if(it!=prices.end()){prices.erase(it);}}prices.emplace(price);}int current() {return timePriceMap[maxTimestamp];}int maximum() {return *prices.rbegin();}int minimum() {return *prices.begin();}
};/*** Your StockPrice object will be instantiated and called as such:* StockPrice* obj = new StockPrice();* obj->update(timestamp,price);* int param_2 = obj->current();* int param_3 = obj->maximum();* int param_4 = obj->minimum();*/

2578 最小和分割(10.9)

给你一个正整数 num ,请你将它分割成两个非负整数 num1num2 ,满足:

  • num1num2 直接连起来,得到 num 各数位的一个排列。

    • 换句话说,num1num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。
  • num1num2 可以包含前导 0 。

请你返回 num1num2 可以得到的和的 最小 值。

提示:

  • 10 <= num <= 10^9

【排序 + 奇偶对】

int cmp(void *a,void *b){return *(int*)a-*(int*)b;
}
int splitNum(int num){int *split=malloc(sizeof(int)*20);int cnt=0;while(num>0){split[cnt++]=num%10;num/=10;}qsort(split,cnt,sizeof(int),cmp);int n1=0,n2=0;for(int i=0;i<cnt;i++){if(i%2==0){n1*=10;n1+=split[i];}else{n2*=10;n2+=split[i];}}return n1+n2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单对比一下 C 与 Go 两种语言

使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言&#xff0c;追溯其历史大部分源自编程语言 C。所以&#xff0c;任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易&#xff0c;同时避免了 C 编程语言的…

阶段五-Day03-Ajax

一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…

第十二章:泛型(Generic)

1&#xff1a;为什么要有泛型&#xff1f; 泛型&#xff1a;&#xff08;标签&#xff09;允许在定义类、接口时候通过一个标识来表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型、参数将在使用时&#xff08;例如&#xff1a;继承或实现这个接口&#xff0…

QML 带框最大化显示方法

1.QML窗口最大化很多会给出如下方法: visibility: "FullScreen" 此方法不好的方面是没有最大化&#xff0c;最小化&#xff0c;关闭按钮 2.通过showMaximized() 方法可以满足我们需求:在onCompleted 方法中执行 实现的效果如下:

QT基础入门——界面布局和常用控件(四)

前言&#xff1a; 所谓 GUI 界面&#xff0c;归根结底&#xff0c;就是一堆组件的叠加。我们创建一个窗口&#xff0c;把按钮放上面&#xff0c;把图标放上面&#xff0c;这样就成了一个界面。在放置时&#xff0c;组件的位置尤其重要。我们必须要指定组件放在哪里&#xff0c…

妙鸭相机功能代码复现

妙鸭相机功能代码复现 妙鸭相机主要实现人脸替换与人脸高清增强修复功能。可通过两种方式实现Roop和Lora模型。 RooP笔记 基础模型:inswapper_128.onnx 人脸分析模型:insightface 高清增强模型:gfpgan 大体流程为通过insightface检测出人脸,替换人脸,使用gfpgan对人…

设计模式——14. 观察者模式

1. 说明 观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含…

改变世界-生成式人工智能

麦肯锡在其《生成人工智能的经济潜力&#xff1a;下一个生产力前沿》中声称&#xff0c;“ChatGPT、GitHub Copilot、Stable Diffusion 等生成式人工智能应用程序以 AlphaGo 没有的方式吸引了世界各地人们的想象力&#xff0c;这要归功于它们广泛的实用性——几乎任何人都可以使…

Java中的Iterator

Java中的Iterator Iterator 是Java中的一个接口&#xff0c;它提供了一种访问集合&#xff08;如列表、集合等&#xff09;中元素的标准方式。Iterator 具有一些特点、优点和缺点&#xff0c;下面详细介绍如何使用它以及相关信息。 使用Iterator&#xff1a; 创建Iterator&am…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#xff0c;需包含用户登录&#xff0c;用户删除&#xff0c;用户查询功能&#xff0c;并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口&#xff0c;规定必须完成用户登录&#xff0c;用户删除&#xff0c…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

华为OD七日集训第7期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第7期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结 大家好&a…

基于Stable Diffusion的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…

【C++】Stack Queue -- 详解

一、stack的介绍和使用 1、stack的介绍 https://cplusplus.com/reference/stack/stack/?kwstack 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…

linux中命令行如何使用git

在Linux中&#xff0c;您可以使用命令行来使用Git版本控制系统。以下是一些常见的Git命令&#xff0c;用于在Linux终端中进行版本控制&#xff1a; 安装Git&#xff1a;如果您的Linux系统上还没有安装Git&#xff0c;可以使用适合您的包管理器来安装它。例如&#xff0c;在Ubu…

Java中树形菜单的实现方式(超全详解!)

前言 这篇文中&#xff0c;我一共会用两种方式来实现目录树的数据结构&#xff0c;两种写法逻辑是一样的&#xff0c;只是一种适合新手理解&#xff0c;一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码&#xff0c;主要是方便新人看懂&#xff0…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

AQS内部的体系架构

AQS本质上是一个双向队列&#xff0c;加一个状态位state。内部靠Node节点形成队列。 AQS由state和CLH变体的虚拟双端队列组成。 AQS的内部类Node类 属性说明&#xff1a; 内部结构&#xff1a;

合并K个已排序的链表

题目 链接 描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 示例1 输入&#xff1a; [{1,2,3},{4,5,6,7}] 返回值&#xff1a; {1,2,3,4,5,6,7} 示例2 输入&#xff1a; [{1,2},{1,4,5},{6}] 返回值&#xff1a; {1,1,2,4,5,6} 题解&#xff08;合并&…