返回

技术宅教你掌握LeetCode 难题:621、581、503、442 迎刃而解!

闲谈

掌握 LeetCode 难题的秘密武器

在开始解决这些难题之前,我们先来了解一下解决 LeetCode 难题的秘密武器——思维导图。思维导图是一种可视化工具,可以帮助你整理思路,理清问题的关键点。对于 LeetCode 难题来说,思维导图可以帮助你快速理解题意,找出解题思路,并在解题过程中避免遗漏重要细节。

LeetCode 621:任务调度器

题目

给你一个包含 n 个任务的数组 tasks,其中每个任务都有一个对应的冷却时间 cooldown。当完成一个任务时,需要等待 cooldown 秒后才能执行下一个任务。你的目标是安排任务的执行顺序,以最小化总的等待时间。

解题思路:

这道题可以利用贪心算法来解决。贪心算法是一种在每一步选择最优解的算法,它可以帮助我们在有限的时间内找到一个足够好的解。在 LeetCode 621 中,我们可以在每一步选择一个冷却时间最短的任务来执行,这样可以最小化总的等待时间。

Java 代码:

public int leastInterval(char[] tasks, int cooldown) {
    int[] taskCount = new int[26];
    for (char task : tasks) {
        taskCount[task - 'A']++;
    }

    Arrays.sort(taskCount);
    int maxCount = taskCount[25];
    int idleSlots = (maxCount - 1) * cooldown;

    for (int i = 24; i >= 0 && idleSlots > 0; i--) {
        idleSlots -= Math.min(maxCount - 1, taskCount[i]);
    }

    return idleSlots > 0 ? idleSlots + tasks.length : tasks.length;
}

LeetCode 581:最短无序连续子数组

题目:

给你一个整数数组 nums,请你找出数组中最短的连续子数组,并返回该子数组的长度。这个子数组应该满足以下条件:

  • 子数组的长度大于等于 2,
  • 子数组元素未排序。

解题思路:

这道题可以使用滑动窗口算法来解决。滑动窗口算法是一种在线处理数据流的算法,它可以帮助我们在有限的时间内找到一个足够好的解。在 LeetCode 581 中,我们可以使用滑动窗口算法来找到最短的无序连续子数组。

Python 代码:

def findUnsortedSubarray(nums):
    n = len(nums)
    min_unsorted = n
    max_unsorted = 0

    # Find the first and last unsorted elements
    for i in range(1, n):
        if nums[i] < nums[i - 1]:
            min_unsorted = min(min_unsorted, i)

    for i in range(n - 2, -1, -1):
        if nums[i] > nums[i + 1]:
            max_unsorted = max(max_unsorted, i)

    # Calculate the length of the unsorted subarray
    if min_unsorted == n:
        return 0
    else:
        return max_unsorted - min_unsorted + 1

LeetCode 503:下一个更大元素 I

题目:

给你两个没有重复元素的整数数组 nums1 和 nums2 ,其中 nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个更大元素。下一个更大元素是指大于该元素的下一个元素。如果不存在下一个更大元素,那么该元素为 -1 。

解题思路:

这道题可以使用栈来解决。栈是一种数据结构,它可以按照先进后出的原则存储数据。在 LeetCode 503 中,我们可以使用栈来存储 nums1 中的元素,并从 nums2 中找到每个元素的下一个更大元素。

Java 代码:

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    Stack<Integer> stack = new Stack<>();
    Map<Integer, Integer> nextGreaterElementMap = new HashMap<>();

    for (int num : nums2) {
        while (!stack.isEmpty() && num > stack.peek()) {
            nextGreaterElementMap.put(stack.pop(), num);
        }
        stack.push(num);
    }

    int[] nextGreaterElementArray = new int[nums1.length];
    for (int i = 0; i < nums1.length; i++) {
        nextGreaterElementArray[i] = nextGreaterElementMap.getOrDefault(nums1[i], -1);
    }

    return nextGreaterElementArray;
}

LeetCode 442:数组中重复的数据

题目描述:

给你一个长度为 n 的整数数组 nums ,其中 nums 中的所有整数都在范围 [1, n] 内,且每个整数出现一次或两次。请你找出所有出现两次的整数,并以数组形式返回。

解题思路:

这道题可以使用哈希表来解决。哈希表是一种数据结构,它可以根据键值对来存储数据。在 LeetCode 442 中,我们可以使用哈希表来存储 nums 中的元素,并找出所有出现两次的元素。

Python 代码:

def findDuplicates(nums):
    hash_table = {}
    duplicates = []

    for num in nums:
        if num in hash_table:
            duplicates.append(num)
        else:
            hash_table[num] = True

    return duplicates

结语

LeetCode 难题虽然具有挑战性,但也是磨练编程技能的绝佳机会。通过解决这些难题,你可以提升自己的算法和数据结构能力,为你在编程领域的职业发展打下坚实的基础。希望这份详细指南能够帮助你轻松掌握 LeetCode 难题,并在编程领域不断进步。