【计算几何 矢量】2280. 表示一个折线图的最少线段数|1681

本文涉及知识点

数学

计算几何

LeetCode 2280. 表示一个折线图的最少线段数

给你一个二维整数数组 stockPrices ,其中 stockPrices[i] = [dayi, pricei] 表示股票在 dayi 的价格为 pricei 。折线图 是一个二维平面上的若干个点组成的图,横坐标表示日期,纵坐标表示价格,折线图由相邻的点连接而成。比方说下图是一个例子:

请你返回要表示一个折线图所需要的 最少线段数 。

示例 1:

输入:stockPrices = [[1,7],[2,6],[3,5],[4,4],[5,4],[6,3],[7,2],[8,1]]

输出:3

解释:

上图为输入对应的图,横坐标表示日期,纵坐标表示价格。

以下 3 个线段可以表示折线图:

  • 线段 1 (红色)从 (1,7) 到 (4,4) ,经过 (1,7) ,(2,6) ,(3,5) 和 (4,4) 。
  • 线段 2 (蓝色)从 (4,4) 到 (5,4) 。
  • 线段 3 (绿色)从 (5,4) 到 (8,1) ,经过 (5,4) ,(6,3) ,(7,2) 和 (8,1) 。
    可以证明,无法用少于 3 条线段表示这个折线图。
    示例 2:

输入:stockPrices = [[3,4],[1,2],[7,8],[2,3]]

输出:1

解释:

如上图所示,折线图可以用一条线段表示。

提示:
1 < = s t o c k P r i c e s . l e n g t h < = 1 0 5 1 <= stockPrices.length <= 10^5 1<=stockPrices.length<=105

stockPrices[i].length == 2
1 < = d a y i , p r i c e i < = 1 0 9 1 <= dayi, pricei <= 10^9 1<=dayi,pricei<=109

所有 dayi 互不相同 。

叉乘判断共线

二维叉乘 x1y2-x2y1,值为0    ⟺    \iff ⟺共线。

代码

核心代码

cpp 复制代码
class Solution {
 public:
	 int minimumLines(vector<vector<int>>& stockPrices) {
		 sort(stockPrices.begin(), stockPrices.end());
		 const int n = stockPrices.size();
		 if (n <= 1)
		 {
			 return 0;
		 }
		 int iRet = 1;
		 for (int i = 2; i < n; i++)
		 {
			 long long y1 = stockPrices[i][1] - stockPrices[i-1][1];
			 long long y0 = stockPrices[i-1][1] - stockPrices[i - 2][1];
			 long long x1 = stockPrices[i][0] - stockPrices[i - 1][0];
			 long long x0 = stockPrices[i - 1][0] - stockPrices[i - 2][0];
			 if (y1*x0 != y0*x1)
			 {
				 iRet++;
			 }
		 }
		 return iRet;
	 }
 };

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
员工说:技术至上,老板不信;投资人的代表说:技术至上,老板会信。
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法 用**C++**实现。

相关推荐
AI进化营-智能译站17 分钟前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit26 分钟前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen8739 分钟前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler011 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1131 小时前
Linux进程与线程编程详解
linux·c++
A7bert7772 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902702 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
zh_xuan3 小时前
libcurl调用https接口
c++·libcurl