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

posted @ 2016-03-19 10:29  zzhall  阅读(614)  评论(0)    收藏  举报