LeetCode题解:18.四数之和【Python题解超详细】,三数之和 vs. 四数之和

题目描述

        给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

        你可以按 任意顺序 返回答案 。

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

解答

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        # 最终结果列表
        result = []
        
        # 如果输入列表为空或长度小于4,直接返回空列表
        if not nums or len(nums) < 4:
            return result
        
        # 对数组进行排序,以便使用双指针法
        nums.sort()
        n = len(nums)
        
        # 第一层循环:固定第一个数
        for i in range(n - 3):
            # 跳过重复元素,避免结果重复
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            # 剪枝:当前最小的四个数和已经大于目标值,后续无需处理
            if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
                break
            # 剪枝:当前最大的四个数和还小于目标值,直接跳过当前循环
            if nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] < target:
                continue
            
            # 第二层循环:固定第二个数
            for j in range(i + 1, n - 2):
                # 跳过重复元素,避免结果重复
                if j > i + 1 and nums[j] == nums[j - 1]:
                    continue
                # 剪枝:当前最小的四个数和已经大于目标值,后续无需处理
                if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:
                    break
                # 剪枝:当前最大的四个数和还小于目标值,直接跳过当前循环
                if nums[i] + nums[j] + nums[n - 2] + nums[n - 1] < target:
                    continue
                
                # 双指针寻找符合条件的剩余两个数
                left, right = j + 1, n - 1
                while left < right:
                    # 当前四数之和
                    s = nums[i] + nums[j] + nums[left] + nums[right]
                    
                    # 如果找到目标和
                    if s == target:
                        result.append([nums[i], nums[j], nums[left], nums[right]])
                        
                        # 跳过重复元素
                        while left < right and nums[left] == nums[left + 1]:
                            left += 1
                        left += 1
                        
                        while left < right and nums[right] == nums[right - 1]:
                            right -= 1
                        right -= 1
                    
                    # 如果当前和小于目标值,移动左指针以增加和
                    elif s < target:
                        left += 1
                    
                    # 如果当前和大于目标值,移动右指针以减小和
                    else:
                        right -= 1
        
        # 返回结果
        return result

        思路,排序+双指针:该代码通过 **排序+双指针** 的思路解决四数之和问题。首先对数组排序,然后通过两层循环固定前两个数,并使用双指针在剩余部分寻找符合条件的另外两个数。通过剪枝优化(跳过不可能的情况)和去重操作(避免重复结果),提升效率并确保结果的唯一性。最终将所有符合条件的四元组返回。代码的时间复杂度为 O(n^3),适合中小规模的输入数据。

四数之和 vs. 三数之和

        这道题实际上是LeetCode15题:三数之和的拓展版,与使用 排序+双指针 求解三数之和相同的是两者都使用了 排序 + 双指针 的方法来寻找目标组合,即通过固定部分数字后,利用双指针在剩余数组中寻找满足条件的组合。同时,两者都是通过嵌套循环和双指针来解决问题,三数之和的时间复杂度为 O(n^2),四数之和则要多一层循环,其时间复杂度为 O(n^3)。并且,在去重逻辑上,两者都需要跳过重复元素以避免重复结果。此外,两者所采用的剪枝思路也是相同的。

        根据上述思路,你能想出计算五数之和的思路,并思考它的时间复杂度吗?

感谢阅读,希望对你有所帮助~

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值