leetcode
leetcode 3051 ~ 3100
符文储备

符文储备

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 48 ms, 内存: 16.8 MB


import java.util.Arrays;

/**
 * The main idea is to use Java Streams to sort the runes and then find the longest subarray where
 * the difference between any two consecutive elements is at most 1.
 */
public class RuneExpeditionStream {
    public int maxRunes(int[] runes) {
        int[] sortedRunes = Arrays.stream(runes).sorted().toArray(); // Sort the runes array using streams
        int maxCount = 1; // Initialize maxCount
        int currentCount = 1; // Initialize currentCount

        for (int i = 1; i < sortedRunes.length; i++) {
            if (sortedRunes[i] - sortedRunes[i - 1] <= 1) { // Check if the current rune and the previous rune difference is at most 1
                currentCount++; // Increment current count
                maxCount = Math.max(maxCount, currentCount); // Update max count if needed
            } else {
                currentCount = 1; // Reset current count
            }
        }

        return maxCount; // Return the maximum number of runes that can be carried
    }

    public static void main(String[] args) {
        RuneExpeditionStream re = new RuneExpeditionStream();
        int[] runes1 = {1, 3, 5, 4, 1, 7};
        int[] runes2 = {1, 1, 3, 3, 2, 4};
        System.out.println(re.maxRunes(runes1)); // Output: 3
        System.out.println(re.maxRunes(runes2)); // Output: 6
    }
}

解释

方法:

首先使用计数器对 runes 中每个元素的出现次数进行统计,然后将这些魔力值排序。通过遍历这些排序后的魔力值,我们可以构建连续的符文块。如果两个连续的魔力值差大于 1,说明不能将它们放在一起,因此需要结束当前块的计数并开始新块的计数。通过这种方法,我们可以找到最大连续符文块的大小。

时间复杂度:

O(n + m log m)

空间复杂度:

O(m)

代码细节讲解

🦆
题解中提到如果两个连续的魔力值差大于1,则需要结束当前块的计数并开始新块的计数。请问为什么不考虑这两种魔力值之间可能存在的其他未出现的魔力值?
在构建连续符文块时,题解的目标是找出数组中连续的、数值上相邻的魔力值的最大集合。如果两个符文的魔力值之间的差大于1,意味着在这两个魔力值之间不存在其他魔力值,或者这些中间的魔力值在输入的符文列表中没有出现。由于题目要求的是连续的符文块,所以这些未出现的或数值不相邻的魔力值不能被用来形成连续的块,因此在这种情况下,我们必须结束当前块的计数并开始新的计数。
🦆
题解中使用了排序方法来处理魔力值,这种方法在哪些特定的输入情况下可能会导致效率降低?
排序操作的时间复杂度通常是O(n log n),其中n是需要排序的元素数量。在题解中,排序是对符文魔力值的唯一出现进行排序。如果输入的符文列表中包含大量的不同魔力值,那么排序操作将涉及大量的元素,从而增加计算时间。特别是当输入列表非常长且符文种类繁多时,排序可能成为算法中最耗时的部分。
🦆
在题解的代码中,当连续符文块中断时,为什么是将当前块的计数重置为0而不是将其设置为下一个魔力值的计数?
这是因为当前块的结束是由于魔力值之间的断裂(即两个连续魔力值之间的差大于1)。当这种情况发生时,前一个块与当前考虑的魔力值之间没有连续性,因此必须开始一个全新的块。将当前块的计数重置为0是为了准备新的计数累计,开始统计下一个连续块。此时,累加下一个魔力值的计数是在之后的循环中进行的,因此初始化为0是确保计数正确开始的必要步骤。

相关问题