返回

LeetCode 刷题之勇者无畏:如何征服 178周赛

前端

LeetCode 178 周赛:算法盛宴,迎接挑战!

题目解析

LeetCode 178 周赛如约而至,带来三道难度不一的算法题,是时候检验你的算法功底了!

1779. 寻找与给定 X 或 Y 坐标相邻的最近点

给你一个整数数组 nums,其中 nums[i] 表示第 i 个点的 X 坐标,还有一个整数数组 queries,其中 queries[j] 表示第 j 个查询的 X 坐标。你需要找到数组 nums 中离给定查询 X 坐标最近的点,如果有多个点,则返回满足条件的点中最小的下标。

1780. 判断一个数能否表示为两个整数的平方和

给定一个非负整数 n,你需要判断该数字是否能够表示成两个整数的平方和。

1781. 所有子串的美丽值之和

给你一个只包含 '0' 和 '1' 的字符串 s,你需要返回组成 s 的所有子串的美丽值之和。美丽值被定义为子串中 '0' 的数量和 '1' 的数量之间的最小差值。

算法实现

1. 1779. 寻找与给定 X 或 Y 坐标相邻的最近点

我们可以使用双指针法来解决这个问题。首先,我们将两个指针指向数组 nums 的首尾元素。然后,我们比较指针指向的两个元素与查询元素的距离。如果指针指向的元素与查询元素的距离比另一个指针指向的元素与查询元素的距离更近,那么我们将指针指向的元素更新为当前指针指向的元素。否则,我们将另一个指针指向的元素更新为当前指针指向的元素。重复上述步骤,直到两个指针相遇。此时,两个指针指向的元素就是离查询元素最近的元素。

def nearestValidPoint(nums, queries):
    result = []
    for query in queries:
        min_dist = float('inf')
        idx = -1
        for i in range(len(nums)):
            dist = abs(nums[i] - query)
            if dist < min_dist or (dist == min_dist and i < idx):
                min_dist = dist
                idx = i
        result.append(idx)
    return result

2. 1780. 判断一个数能否表示为两个整数的平方和

我们可以使用裴蜀定理来解决这个问题。裴蜀定理指出,如果两个整数 ab 互质,那么对于任意整数 c,方程 a² + b² = c² 都有整数解 xy。换而言之,如果两个整数的平方和等于一个整数,那么这两个整数一定互质。

def judgeSquareSum(n):
    i = 0
    j = int(n ** 0.5)
    while i * i <= n:
        if i * i + j * j == n:
            return True
        elif i * i + j * j < n:
            i += 1
        else:
            j -= 1
    return False

3. 1781. 所有子串的美丽值之和

我们可以使用动态规划来解决这个问题。首先,我们将字符串 s 分成所有可能的子串。然后,我们计算每个子串的美丽值。最后,我们将所有子串的美丽值相加,得到组成 s 的所有子串的美丽值之和。

def beautySum(s):
    n = len(s)
    beauty = [0] * n
    for i in range(n):
        cnt0 = cnt1 = 0
        for j in range(i, n):
            if s[j] == '0':
                cnt0 += 1
            else:
                cnt1 += 1
            beauty[i] += min(cnt0, cnt1)
    return sum(beauty)

总结

LeetCode 178 周赛的题目难度适中,涵盖了不同的算法知识点。通过解决这些题目,我们可以提高自己的算法能力和编程水平。同时,我们也可以在比赛中与其他选手交流心得,共同进步。希望大家能够积极参与 LeetCode 178 周赛,并在比赛中取得优异的成绩!

常见问题解答

1. 如何准备 LeetCode 178 周赛?

  • 复习基本的算法和数据结构知识。
  • 练习解决 LeetCode 上的其他题目。
  • 参加模拟比赛或小组讨论。

2. 比赛期间应该使用什么语言?

  • LeetCode 178 周赛支持多种编程语言,包括 Java、Python、C++ 等。

3. 比赛时间是多少?

  • LeetCode 178 周赛通常在周六下午 14:00-16:00(北京时间)举行,时长为 120 分钟。

4. 如何提交我的解决方案?

  • 在比赛期间,你可以通过 LeetCode 网站提交你的解决方案。
  • 提交后,你的解决方案将被自动评测。

5. 如何查看我的排名?

  • 比赛结束后,你的排名将显示在 LeetCode 网站上。