引言
计算斜率时,首先想动除法,但是在计算机中,使用除法会出现精度的问题,导致无法正常比较。
本题要点
这道题要判断是不是折线,本质是比较3个点连成的两条线段是否共线
p
1
(
x
1
,
y
1
)
,
p
2
(
x
2
,
y
2
)
,
p
3
(
x
3
,
y
3
)
p_1(x_1,y_1),p_2(x_2,y_2),p_3(x_3,y_3)
p1(x1,y1),p2(x2,y2),p3(x3,y3)
我们可以列出等式
y
2
−
y
1
x
2
−
x
1
=
y
3
−
y
2
x
3
−
x
2
\frac{y_2-y_1}{x_2-x_1} = \frac{y_3-y_2}{x_3-x_2}
x2−x1y2−y1=x3−x2y3−y2
此时都经过点p2的线段斜率相等,他们就在共线,无需增加折线数。为了不产生除法运算。我们可以转化等式为:
(
y
2
−
y
1
)
(
x
3
−
x
2
)
=
(
y
3
−
y
2
)
(
x
2
−
x
1
)
(y_2-y_1)(x_3-x_2) = (y_3-y_2)(x_2-x_1)
(y2−y1)(x3−x2)=(y3−y2)(x2−x1)
这样我们把数据带入,等式若不成立,则三点不共线,我们需要把折线数量加1。
代码实现
完整代码如下:
public int minimumLines(int[][] stockPrices) {
if(stockPrices.length==1) return 0;
int len = stockPrices.length;
int ans = 1;
Arrays.sort(stockPrices,(a, b) -> a[0]-b[0]);
for(int i=1;i<len-1;i++){
int a = (stockPrices[i][0] - stockPrices[i-1][0])*(stockPrices[i+1][1] - stockPrices[i][1]);
int b = (stockPrices[i+1][0] - stockPrices[i][0])*(stockPrices[i][1] - stockPrices[i-1][1]);
if(a!=b){
ans+=1;
}
}
return ans;
}