leetcode每日一题系列-路径交叉-「暴力存储」-「分类讨论」

956 阅读1分钟

leetcode-335-路径交叉

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

给你一个整数数组 distance 。

从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。

判断你所经过的路径是否相交。如果相交,返回 true ;否则,返回 false 。

 

示例 1:

输入:distance = [2,1,1,2]
输出:true

示例 2:

输入:distance = [1,2,3,4]
输出:false

示例 3:

输入:distance = [1,1,1,1]
输出:true

提示:

  • 1 <= distance.length <= 10510^5
  • 1 <= distance[i] <= 10510^5

思路一:暴力搜索

  • 将每个点存入map然后判断结果
  • 嘿嘿TLE
class Solution {
  public boolean isSelfCrossing(int[] distance) {
            Set<String> set = new HashSet<>();
            set.add("0,0");
            int x = 0, y = 0;
            for (int i = 0; i < distance.length; i++) {
                int temp = i % 4;
                for (int j = 1; j <= distance[i]; j++) {
                    StringBuilder sb = new StringBuilder();
                    switch (temp) {
                        case 0:
                            sb.append(x).append(",").append(y + j);
                            break;
                        case 1:
                            sb.append(x - j).append(",").append(y);
                            break;
                        case 2:
                            sb.append(x).append(",").append(y - j);
                            break;
                        case 3:
                            sb.append(x + j).append(",").append(y);
                            break;
                    }
                    if (set.contains(sb.toString())) {
                        return true;
                    }
                    set.add(sb.toString());
                }
                switch (temp) {
                    case 0:
                        y += distance[i];
                        break;
                    case 1:
                        x -= distance[i];
                        break;
                    case 2:
                        y -= distance[i];
                        break;
                    case 3:
                        x += distance[i];
                        break;
                }
            }


            return false;
        }

}
  • 时间复杂度O(0nnum\sum_0^nnum)
  • 空间复杂度O(0nnum\sum_0^nnum)

思路二:找规律

  • 呜呜呜 抽象画图能力太离谱了
class Solution {
    public boolean isSelfCrossing(int[] d) {
        int n = d.length;
        if (n < 4) return false;
        for (int i = 3; i < n; i++) {
            if (d[i] >= d[i - 2] && d[i - 1] <= d[i - 3]) return true;
            if (i >= 4 && d[i - 1] == d[i - 3] && d[i] + d[i - 4] >= d[i - 2]) return true;
            if (i >= 5 && d[i - 1] <= d[i - 3] && d[i - 2] > d[i - 4] && d[i] + d[i - 4] >= d[i - 2] && d[i - 1] + d[i - 5] >= d[i - 3]) return true;
        }
        return false;
    }
}
  • 时间复杂度O(nn)
  • 空间复杂度O(11)