技术宅教你掌握LeetCode 难题:621、581、503、442 迎刃而解!
2024-02-15 12:25:49
掌握 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 难题,并在编程领域不断进步。