题目链接:335. 路径交叉 - 力扣(LeetCode) (leetcode-cn.com)
题目描述:
给你一个整数数组 distance 。
从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。
判断你所经过的路径是否相交。如果相交,返回 true ;否则,返回 false 。(难度:困难)
方法一:归纳法(归纳路径交叉的情况)
class Solution { public: bool isSelfCrossing(vector& distance) { int n = distance.size(); for (int i = 3; i < n; ++i) { // 第 1 类路径交叉的情况 if (distance[i] >= distance[i - 2] && distance[i - 1] <= distance[i - 3]) { return true; } // 第 2 类路径交叉的情况 if (i == 4 && (distance[3] == distance[1] && distance[4] >= distance[2] - distance[0])) { return true; } // 第 3 类路径交叉的情况 if (i >= 5 && (distance[i - 3] - distance[i - 5] <= distance[i - 1] && distance[i - 1] <= distance[i - 3] && distance[i] >= distance[i - 2] - distance[i - 4] && distance[i - 2] > distance[i - 4])) { return true; } } return false; } };
方法二:归纳法(归纳路径不交叉时的状态)
class Solution { public: bool isSelfCrossing(vector& distance) { int n = distance.size(); // 处理第 1 种情况 int i = 0; while (i < n && (i < 2 || distance[i] > distance[i - 2])) { ++i; } if (i == n) { return false; } // 处理第 j 次移动的情况 if ((i == 3 && distance[i] == distance[i - 2]) || (i >= 4 && distance[i] >= distance[i - 2] - distance[i - 4])) { distance[i - 1] -= distance[i - 3]; } ++i; // 处理第 2 种情况 while (i < n && distance[i] < distance[i - 2]) { ++i; } return i != n; } };
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)