สมมติว่าเรามีอาร์เรย์ x ของ n ตัวเลข เราเริ่มต้นที่จุด (0,0) และเคลื่อน x[0] หน่วยไปทางทิศเหนือ จากนั้น x[1] หน่วยไปทางทิศตะวันตก x[2] หน่วยไปทางทิศใต้ , x[3] หน่วยไปทางทิศตะวันออก ทิศทางและอื่น ๆ กล่าวอีกนัยหนึ่ง หลังจากที่แต่ละการเคลื่อนไหว ทิศทางของเราจะเปลี่ยนทวนเข็มนาฬิกา เราต้องสร้างอัลกอริธึมหนึ่งรอบโดยมีพื้นที่พิเศษ O(1) เพื่อพิจารณาว่าเส้นทางของเราตัดผ่านหรือไม่
ดังนั้นหากอาร์เรย์เป็นแบบ − [3,4,2,5]

คำตอบจะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
แทรก 0 ที่ดัชนี 4 ของ x
-
n :=ขนาดของ x, ผม :=4
-
สำหรับการไม่เริ่มต้นอะไรเลยเมื่อ i
x[i - 2] ให้เพิ่ม i ขึ้น 1 ทำ − -
ไม่ทำอะไรเลย
-
-
ถ้าฉันเหมือนกับ n ให้คืนค่าเท็จ
-
ถ้า x[i]>=x[i - 2] - x[i - 4] แล้ว
-
x[i - 1] =x[i - 1] - x[i - 3]
-
-
เพื่อเพิ่ม i ขึ้น 1 เมื่อฉัน
-
ไม่ทำอะไรเลย
-
-
คืนค่า จริง เมื่อฉันไม่เหมือนกับ n
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isSelfCrossing(vector<int>& x) {
x.insert(x.begin(), 4, 0);
int n = x.size();
int i = 4;
for(; i < n && x[i] > x[ i - 2];i++);
if(i == n) return false;
if (x[i] >= x[i - 2] - x[i - 4]){
x[i - 1] -= x[i - 3];
}
for (i++; i < n && x[i] < x[i - 2]; i++);
return i != n;
}
};
main(){
Solution ob;
vector<int> v = {3,4,2,5};
cout << (ob.isSelfCrossing(v));
} อินพุต
{3,4,2,5} เอาท์พุต
1