classSolution{public:boolisConvex(vector<vector<int>>&points){autogetCross=[](constvector<int>&p,constvector<int>&q,constvector<int>&r)->int{return(q[0]-p[0])*(r[1]-p[1])-(q[1]-p[1])*(r[0]-p[0]);};constintn=points.size();longsign=0;for(inti=0;i<points.size();++i){constintcross=getCross(points[i],points[(i+1)%n],points[(i+2)%n]);if(cross==0)// P, q, r are collinearcontinue;if(sign==0)// Find first cross that's not 0sign=cross;elseif(cross*sign<0)returnfalse;}returntrue;}};
classSolution{publicbooleanisConvex(List<List<Integer>>points){finalintn=points.size();longsign=0;for(inti=0;i<n;++i){finalintcross=getCross(points.get(i),points.get((i+1)%n),points.get((i+2)%n));if(cross==0)// P, q, r are collinearcontinue;if(sign==0)// Find first cross that's not 0sign=cross;elseif(cross*sign<0)returnfalse;}returntrue;}privateintgetCross(List<Integer>p,List<Integer>q,List<Integer>r){return(q.get(0)-p.get(0))*(r.get(1)-p.get(1))-(q.get(1)-p.get(1))*(r.get(0)-p.get(0));}}
classSolution:defisConvex(self,points:List[List[int]])->bool:# Pq x qrdefgetCross(p:List[int],q:List[int],r:List[int]):return(q[0]-p[0])*(r[1]-p[1])-(q[1]-p[1])*(r[0]-p[0])sign=0foriinrange(len(points)):cross=getCross(points[i-2],points[i-1],points[i])ifcross==0:# P, q, r are collinearcontinueifsign==0:# Find first cross that's not 0sign=crosselifcross*sign<0:returnFalsereturnTrue