首页 > 其他分享 >18_四数之和

18_四数之和

时间:2024-09-12 16:49:34浏览次数:9  
标签:四数 target nums int 18 元素 ++ 指针

18_四数之和

【问题描述】

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

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

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

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

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

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

【算法设计思想】

解决这类问题的主要思想基本都是排序+双指针。在解决四数之和这个问题时,我们可以仿照三数之和,再在外面加上一层for循环,然后再进行相同的处理即可。

对于三数之和,详见

【算法描述】

C++:

class Solution {
public:
    // 定义一个方法 fourSum,接收一个整数向量 nums 和一个整数目标值 target
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        // 首先对输入的整数向量进行排序
        sort(nums.begin(), nums.end());
        
        // 初始化结果向量,用于存放所有满足条件的四元组
        vector<vector<int>> ans;
        
        // 遍历整个数组
        for (int i = 0; i < nums.size(); i++) {
            // 如果当前元素与前一个元素相同,则跳过此次循环,避免重复计算
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            
            // 内层循环遍历数组中剩余的部分
            for (int j = i + 1; j < nums.size(); j++) {
                // 同样地,如果当前元素与前一个元素相同,则跳过此次循环
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                
                // 定义两个指针 l 和 r,分别指向当前内层循环起始位置的下一个元素和数组的最后一个元素
                int l = j + 1, r = nums.size() - 1;
                
                // 计算剩余两个元素需要达到的目标和
                int sum = target - nums[i] - nums[j];
                
                // 双指针法查找符合条件的另外两个数
                while (l < r) {
                    if (nums[l] + nums[r] == sum) {
                        // 当找到符合条件的一组解时,将其添加到结果向量中
                        ans.push_back({nums[i], nums[j], nums[l], nums[r]});
                        
                        // 移动指针,并跳过重复的元素
                        while (l < r && nums[l] == nums[l + 1]) {
                            l++;
                        }
                        while (l < r && nums[r] == nums[r - 1]) {
                            r--;
                        }
                        
                        // 更新指针的位置
                        l++;
                        r--;
                    } else if (nums[l] + nums[r] < sum) {
                        // 如果当前和小于目标和,则移动左指针 l 往右
                        l++;
                    } else {
                        // 如果当前和大于目标和,则移动右指针 r 往左
                        r--;
                    }
                }
            }
        }
        
        // 返回所有找到的四元组组合
        return ans;
    }
};

Java:

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        // 对输入的整型数组进行排序
        Arrays.sort(nums);
        int n = nums.length;
        List<List<Integer>> ans = new ArrayList<>();

        // 遍历数组中的每一个元素作为第一个数
        for (int i = 0; i < n; i++) {
            // 如果当前元素与前一个元素相同,跳过以避免重复解
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            // 内层循环遍历第二个数
            for (int j = i + 1; j < n; j++) {
                // 如果当前元素与前一个元素相同,跳过以避免重复解
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }

                // 初始化两个指针,分别从当前元素的下一个位置和数组末尾开始
                int l = j + 1;
                int r = n - 1;

                // 当左指针小于右指针时执行循环
                while (l < r) {
                    // 计算当前四个数的和
                    long sum = (long)nums[i] + nums[j] + nums[l] + nums[r];

                    // 如果和等于目标值,则将这四个数作为一个解决方案加入答案列表
                    if (sum == target) {
                        ans.add(Arrays.asList(nums[i], nums[j], nums[l], nums[r]));

                        // 移动左右指针并跳过重复元素
                        while (l < r && nums[l] == nums[l + 1]) {
                            l++;
                        }
                        while (l < r && nums[r] == nums[r - 1]) {
                            r--;
                        }

                        // 更新指针位置
                        l++;
                        r--;
                    } else if (sum < target) {
                        // 如果总和小于目标值,则移动左指针尝试更大的数
                        l++;
                    } else {
                        // 如果总和大于目标值,则移动右指针尝试更小的数
                        r--;
                    }
                }
            }
        }

        // 返回所有找到的组合
        return ans;
    }
}


Python:

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        # 对数组进行排序
        nums.sort()
        # 初始化结果列表
        ans = []
        # 获取数组长度
        n = len(nums)

        # 遍历数组中的每一个元素作为第一个数
        for i in range(n):
            # 跳过重复元素以避免重复解
            if i > 0 and nums[i] == nums[i - 1]:
                continue
            # 内层循环遍历第二个数
            for j in range(i + 1, n):
                # 同样跳过重复元素
                if j > i + 1 and nums[j] == nums[j - 1]:
                    continue
                
                # 初始化两个指针
                l = j + 1
                r = n - 1

                # 当左指针小于右指针时执行循环
                while l < r:
                    # 计算当前四个数的和
                    sum = nums[l] + nums[r]
                    if sum + nums[i] + nums[j] == target:
                        # 如果和等于目标值,则添加到结果列表中
                        ans.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 sum + nums[i] + nums[j] < target:
                        # 如果总和小于目标值,则移动左指针尝试更大的数
                        l += 1
                    else:
                        # 如果总和大于目标值,则移动右指针尝试更小的数
                        r -= 1
        # 返回所有找到的组合
        return ans

标签:四数,target,nums,int,18,元素,++,指针
From: https://www.cnblogs.com/zeta186012/p/18410556

相关文章

  • 通过LiveGBS实现GB28181接入不同网络监控摄像头时如何跟不同网络接入设置使用不同的收
    @目录1、背景2、设备接入播放2.1、查看通道2.2、直播播放3、默认收流地址配置4、其它网络设备收流配置5、搭建GB28181视频直播平台1、背景服务器部署的时候,可能有多个网卡多个网段。LiveGBS接入国标摄像头设备,或是下级平台的时候,可能来自于不同的网段。这时候,怎么把不同网络段的......
  • 通过LiveGBS实现安防监控摄像头GB28181转成WebRTC流实现web浏览器网页无插件低延迟直
    @目录1、WebRTC超低延时直播2、WebRTC延时对比3、LiveGBS的低延时的WebRTC流4、分屏页面如何选择默认播放流5、无法播放Webrtc6、搭建GB28181视频直播平台1、WebRTC超低延时直播需要低延时的视频流监控播放,之前可以用rtmp的低延时播放(1秒左右),随着浏览器对rtmp的禁用,无插件的低延......
  • C2A:灾难场景中人体检测数据集(猫脸码客 第185期)
    亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。C2ADataset:HumanDetectioninDisasterScenarios在自然灾害和人为灾难的应......
  • fastjson1.2.24反序列化漏洞复现 CVE-2017-18349
    1.准备:1.1复现环境漏洞环境:vulnhub靶场工具准备:jdk8,apache-maven-3.9.9,kali2024.1,MarshalSec1.2环境启动进入vulnhub目录下的fastjson目录,进入CVE-2017-18349目录cd/home/hbesljx/vulhub/fastjson/1.2.24-rcedocker-compoe启动漏洞环境docker-composeup-d访问靶机......
  • 181 Animation Basics & CSS Transitions
    实现点击Animate,上面的方块移动示例步骤1、为Animate按钮添加@click方法animateBlock<button@click="animateBlock">Animate</button>2、添加animatedBlock变量控制是否可以移动data() {    return {      animatedBlock: false,      dialogIsV......
  • CSP-CCF★★201803-2碰撞的小球★★
    目录一、问题描述二、解答三、总结一、问题描述问题描述数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。当小球到达线段的端点(左端点或......
  • 2024.09.11 1856版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 5.四数相加 II
    .-力扣(LeetCode)给定四个包含整数的数组列表 A,B,C,D,计算有多少个元组(i,j,k,l) ,使得 A[i]+B[j]+C[k]+D[l]=0。为了使问题简单化,所有的A,B,C,D具有相同的长度 N,且0≤N≤500。所有整数的范围在-2^28到2^28-1之间,最终结果不会超过 ......
  • 脂肪秤方案以CSU18M91四电极测脂模块开发
    一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示,并且许多人都将体脂检测数据作为身体健康指数衡量标准,辅助用户来关注身体健康,同时可以通过蓝牙与手机APP应用相连,记录日常身体变化情况,根据变化情况推荐用户饮食计划+运动计划。人体脂肪秤的原理是肌肉内含......
  • 脂肪秤方案以CSU18M91四电极测脂模块开发
    一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示,并且许多人都将体脂检测数据作为身体健康指数衡量标准,辅助用户来关注身体健康,同时可以通过蓝牙与手机APP应用相连,记录日常身体变化情况,根据变化情况推荐用户饮食计划+运动计划。人体脂肪秤的原理是肌肉内含有较多血液......