题目描述
You are given an array x of n
positive numbers. You start at point (0,0)
and moves x[0]
metres to the north, then x[1]
metres to the west, x[2]
metres to the south, x[3]
metres to the east and so on. In other words, after each move your direction changes counter-clockwise.
Write a one-pass algorithm with O(1)
extra space to determine, if your path crosses itself, or not.
题目大意
数组中保存了矩形的边长,每次按照从南向北、从东向西、从北向南、从西向东、从南向北、。。。的方向画线,判断是否有任意两条线相交。
示例
E1
┌───┐ │ │ └───┼──> │ Input: [2,1,1,2] Output: true
E2
┌──────┐ │ │ │ │ └────────────> Input: [1,2,3,4] Output: false
E3
┌───┐ │ │ └───┼> Input: [1,1,1,1] Output: true
解题思路
只需要判断三种情况,第四条线与第一条线相交、第五条线与第一条线相交、第六条线与第一条线相交,其余的任意两条线相交都可以转换成以上三种情况,因此只需要遍历数组,以此判断以上三种情况就可以判断是否有两条线相交。
复杂度分析
时间复杂度:O(N)
空间复杂度:O(1)
代码
class Solution { public: bool isSelfCrossing(vector<int>& x) { int len = x.size(); if(len <= 3) return false; // 遍历数组 for(int i = 3; i < len; ++i) { // 若第一条线与第四条线相交 if(x[i - 1] <= x[i - 3] && x[i] >= x[i - 2]) return true; // 若第一条线与第五条线相交 if(i >= 4) { if(x[i - 1] == x[i - 3] && x[i] + x[i - 4] >= x[i - 2]) return true; } // 若第一条线与第六条线相交 if(i >= 5) { if(x[i] + x[i - 4] >= x[i - 2] && x[i - 1] + x[i - 5] >= x[i - 3] && x[i - 2] >= x[i - 4] && x[i - 1] <= x[i - 3]) return true; } } return false; } };