LeetCode第 123 场双周赛个人题解

慈云数据 2024-03-15 技术支持 73 0

目录

LeetCode第 123 场双周赛个人题解
(图片来源网络,侵删)

一、100222. 三角形类型 II

LeetCode第 123 场双周赛个人题解
(图片来源网络,侵删)

1、原题链接

2、题目描述

3、思路分析

4、代码详解

二、100194. 人员站位的方案数 I

1、原题链接

2、题目描述

3、思路分析

4、代码详解

三、100183. 最大好子数组

1、原题链接

2、题目描述

3、思路分析

4、代码详解

四、100193. 人员站位的方案数 II

1、原题链接

2、题目描述

3、思路分析

4、代码详解


一、100222. 三角形类型 II

1、原题链接

三角形类型 II - 力扣 (LeetCode) 竞赛

2、题目描述

给你一个下标从 0 开始长度为 3 的整数数组 nums ,需要用它们来构造三角形。

  • 如果一个三角形的所有边长度相等,那么这个三角形称为 equilateral 。
  • 如果一个三角形恰好有两条边长度相等,那么这个三角形称为 isosceles 。
  • 如果一个三角形三条边的长度互不相同,那么这个三角形称为 scalene 。

    如果这个数组无法构成一个三角形,请你返回字符串 "none" ,否则返回一个字符串表示这个三角形的类型。

    3、思路分析

    签到题,没什么说的

    复制的时候多了个空格,喜提WA

    时间复杂度:O(1) 空间复杂度:O(1)

    4、代码详解

    class Solution:
        def triangleType(self, nums: List[int]) -> str:
            a, b, c = nums[0], nums[1], nums[2]
            if a + b > c and a + c > b and b + c > a:
                if a == b == c:
                    return "equilateral"
                if a == b or a == c or b == c:
                    return "isosceles"
                return "scalene"
            else:
                return "none"

    二、100194. 人员站位的方案数 I

    1、原题链接

    人员站位的方案数 I - 力扣 (LeetCode) 竞赛

    2、题目描述

    给你一个  n x 2 的二维数组 points ,它表示二维平面上的一些点坐标,其中 points[i] = [xi, yi] 。

    我们定义 x 轴的正方向为 右 (x 轴递增的方向),x 轴的负方向为 左 (x 轴递减的方向)。类似的,我们定义 y 轴的正方向为 上 (y 轴递增的方向),y 轴的负方向为 下 (y 轴递减的方向)。

    你需要安排这 n 个人的站位,这 n 个人中包括 liupengsay 和小羊肖恩 。你需要确保每个点处 恰好 有 一个 人。同时,liupengsay 想跟小羊肖恩单独玩耍,所以 liupengsay 会以 liupengsay 的坐标为 左上角 ,小羊肖恩的坐标为 右下角 建立一个矩形的围栏(注意,围栏可能 不 包含任何区域,也就是说围栏可能是一条线段)。如果围栏的 内部 或者 边缘 上有任何其他人,liupengsay 都会难过。

    请你在确保 liupengsay 不会 难过的前提下,返回 liupengsay 和小羊肖恩可以选择的 点对 数目。

    注意,liupengsay 建立的围栏必须确保 liupengsay 的位置是矩形的左上角,小羊肖恩的位置是矩形的右下角。比方说,以 (1, 1) ,(1, 3) ,(3, 1) 和 (3, 3) 为矩形的四个角,给定下图的两个输入,liupengsay 都不能建立围栏,原因如下:

    • 图一中,liupengsay 在 (3, 3) 且小羊肖恩在 (1, 1) ,liupengsay 的位置不是左上角且小羊肖恩的位置不是右下角。
    • 图二中,liupengsay 在 (1, 3) 且小羊肖恩在 (1, 1) ,小羊肖恩的位置不是在围栏的右下角。

      3、思路分析

      二维偏序问题

      他这个坐标太烦人了,我把它转了一下

      将坐标转换为以左上角为源点,x轴往下延伸,y轴往右延伸

      这样有什么好处呢?我们按x坐标升序排序,x相同就按y升序排序

      然后我们遍历坐标数组,每个元素右边的所有满足纵坐标大于自己的坐标都有机会配对,因为排序后x坐标已经满足了,只用看y坐标

      那么对于那些可能的坐标如何进一步判断配对呢?只要二者围成的区域内没有别的点即可

      这个时候我们坐标变换的好处就体现出来了,我们可以通过二维前缀和来判断区域内是否有别的点(不变换也能求前缀和,但是容易写错)

      只要区域和为2(即只有配对的两个点),我们答案计数+1

      时间复杂度:O(N^2) 空间复杂度:O(U^2),U为坐标最大值

      4、代码详解

      class Solution
      {
      public:
          typedef vector vi;
          int g[55][55];
          int numberOfPairs(vector &p)
          {
              memset(g, 0, sizeof(g));
              int ret = 0, n = p.size();
              for (auto &x : p){
                  int a = x[0] + 1, b = x[1] + 1;
                  g[x[0] = 52 - b][x[1] = a] = 1;
              }
              sort(p.begin(), p.end(), [&](vi &x, vi &y)
                   {
                  if(x[0] != y[0])
                      return x[0] 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon