leetcode-335 Self crossing 解题记录
题目链接:
https://leetcode.com/problems/self-crossing/
大意描述:
读入数组x[n]
按向北、向西、向南、向东的顺序,循环走x[i],返回一个bool值,表示是否会经过自己。
解题过程:
1.
尝试着维护一个最内层的线段,譬如南->北向,就用横坐标最小的作为判定依据,东->西向,就用纵坐标最小最为判定。
后来发现这是不行的,反例:这例子就是可行的,但东西向更新时会一直用左边的那条线,因为它更低。
---------
----- | | |
| ------ |
------------------
2.
遂放弃。改用走两次这种暴力的做法,枚举每条线段是否会被其他所有线段碰到(除了本身就相交的两条和自己以外)。
空间复杂度是o(1)的。记录外层循环线段的信息,内层循环线段的信息,就可以。
C++代码:
1 class Solution { 2 public: 3 bool isSelfCrossing(vector<int>& x) { 4 int n = x.size(); 5 int outer_dir = 0; 6 int inner_dir=0; 7 int outer_cur_p[2]={0,0}; 8 int inner_cur_p[2]={0,0}; 9 bool flag=false; 10 int outterline[3]={0,0,0}; 11 int innerline[3]={0,0,0}; 12 for(int i=0;i<n;i++) 13 { 14 15 outer_dir=i%4; 16 outterline[0]=outer_cur_p[i%2]; 17 outterline[1]=outer_cur_p[(i+1)%2]; 18 if(((i+1)%4)/2==0) 19 outterline[2]=outterline[1]+x[i]; 20 else 21 outterline[2]=outterline[1]-x[i]; 22 //cout<<outterline[0]<<","<<outterline[1]<<","<<outterline[2]<<"."<<endl; 23 inner_cur_p[0]=0; 24 inner_cur_p[1]=0; 25 for(int j=0;j<n;j++) 26 { 27 inner_dir=j%4; 28 innerline[0]=inner_cur_p[j%2]; 29 innerline[1]=inner_cur_p[(j+1)%2]; 30 if(((j+1)%4)/2==0) 31 innerline[2]=innerline[1]+x[j]; 32 else 33 innerline[2]=innerline[1]-x[j]; 34 //cout<<innerline[0]<<","<<innerline[1]<<","<<innerline[2]<<"."<<endl; 35 /*judge if touched*/ 36 if(i!=j&&i!=j+1&&i!=j-1){ 37 if((inner_dir%2)==(outer_dir%2)) 38 { 39 if(outterline[0]==innerline[0]) 40 { 41 int outmax=max(outterline[1],outterline[2]); 42 int outmin=min(outterline[1],outterline[2]); 43 int inmax=max(innerline[1],innerline[2]); 44 int inmin=min(innerline[1],innerline[2]); 45 if((outmax<=inmax&&outmax>=inmin)||(inmax<=outmax&&inmax>=outmin)) 46 { 47 flag=true; 48 break; 49 } 50 } 51 } 52 else 53 { 54 int outmax=max(outterline[1],outterline[2]); 55 int outmin=min(outterline[1],outterline[2]); 56 int inmax=max(innerline[1],innerline[2]); 57 int inmin=min(innerline[1],innerline[2]); 58 if((outterline[0]<=inmax&&outterline[0]>=inmin)&&(innerline[0]<=outmax&&innerline[0]>=outmin)) 59 { 60 flag=true; 61 break; 62 } 63 } 64 } 65 inner_cur_p[j%2]=innerline[0]; 66 inner_cur_p[(j+1)%2]=innerline[2]; 67 68 } 69 if(flag)break; 70 outer_cur_p[i%2]=outterline[0]; 71 outer_cur_p[(i+1)%2]=outterline[2]; 72 } 73 return flag; 74 75 76 77 } 78 };
2016-03-19 10:28:19