leetcode数组中的四数之和与插入区间

84 阅读2分钟

leetcode数组中的四数之和

一、题目描述

四数之和,给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a、b、c 和 d,使得 a + b + c + d = target。找出所有满足条件且不重复的四元组。

二、解题思路

为了避免重复元素,我们首先将数组排序。然后使用嵌套的循环来枚举前两个数,并使用双指针来枚举后两个数,在判断每组元素之和是否等于目标值。为了避免重复,我们需要在每个循环中去除重复解。

三、代码实现

下面是一个简单的实现代码,它可以输出满足条件的四元组组成的列表。主要思想是我们可以使用嵌套循环和双指针来找到所有可能的四元组。

示例代码如下:

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        res = []
        for i in range(n - 3):
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            for j in range(i + 1, n - 2):
                if j > i + 1 and nums[j] == nums[j - 1]:
                    continue
                l, r = j + 1, n - 1
                while l < r:
                    s = nums[i] + nums[j] + nums[l] + nums[r]
                    if s == target:
                        res.append([nums[i], nums[j], nums[l], nums[r]])
                        while l < r and nums[l] == nums[l + 1]:
                            l += 1
                        while l < r and nums[r] == nums[r - 1]:
                            r -= 1
                        l += 1
                        r -= 1
                    elif s < target:
                        l += 1
                    else:
                        r -= 1
        return res

在这个代码中,我们首先将数组排序,在使用嵌套循环枚举前两个数之后,我们使用双指针来枚举后两个数。我们对后两个数分别使用指针 l 和 r 进行从两端向中间的遍历,同时在每次遍历时判断是否满足条件。

四、时间复杂度分析

在上面的代码中,我们使用了嵌套循环和双指针来找到所有可能的四元组。因为事实上我们只是遍历了所有数的组合,所以时间复杂度为O(n^3)。

五、总结

在这个问题中,我们需要使用嵌套循环和双指针来找到所有可能的四元组。通过以上的代码实现,我们可以解决这个问题,并深入了解数组的排序和双指针遍历的方法。

leetcode数组中的插入区间

一、题目描述

插入区间,给定一个无重叠的、按照区间起始端点排序的区间数组 intervals 和一个新的区间 newInterval,将 newInterval 插入到数组 intervals 中,并合并重叠的区间。

二、解题思路

为了拼接区间,我们首先检查新区间是否与每个区间重叠。如果没有,则我们可以将新区间插入到正确的位置。但是,如果存在重叠,我们需要将新区间与重叠区间合并。

具体做法是,我们按顺序迭代每个给定的区间,并与新区间进行重叠检测。当我们遇到一个区间与新区间没有重叠或新区间被完全包含在区间内时,我们可以向答案中添加该区间,并移动到下一区间。否则,它们重叠,我们合并两个区间,并再次重叠检测,直到我们不再重叠。

三、代码实现

下面是一个简单的实现代码,它可以将新区间插入并合并到区间列表中。主要思想是我们可以按照上述的思路逐个遍历区间,并将新区间插入到正确的位置中。

示例代码如下:

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        n = len(intervals)
        if n == 0:
            return [newInterval]
        res = []
        i = 0
        # 找到第一个不重叠的区间
        while i < n and intervals[i][1] < newInterval[0]:
            res.append(intervals[i])
            i += 1
        # 合并重叠区间
        while i < n and intervals[i][0] <= newInterval[1]:
            newInterval[0] = min(newInterval[0], intervals[i][0])
            newInterval[1] = max(newInterval[1], intervals[i][1])
            i += 1
        res.append(newInterval)
        while i < n:
            res.append(intervals[i])
            i += 1
        return res

在上面的代码中,我们首先逐个遍历区间,找到第一个不重叠的区间,并将新区间插入到正确的位置中。然后,我们不断地检查新区间和已存在区间之间的重叠情况,并重叠区间合并。最后,我们将合并后的新区间加入到答案列表中,并在之后添加未被重叠的其他区间。

四、时间复杂度分析

在上面的代码中,我们需要遍历所有的区间。因此,时间复杂度为 O(n)。

五、总结

在这个问题中,我们需要将新区间插入到已存在的区间列表中,并合并重叠的区间。通过以上的代码实现,我们可以解决这个问题,并深入了解了关于合并区间的知识。