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

四数之和(18)

时间:2024-08-05 21:38:28浏览次数:10  
标签:四数 target nums 18 right result && left

题目要求

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

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

这道题整体还是和三数之和的解法相似,只不过这现在是需要两层for循环了,有加了一个j作为内循环,内层循环里面还是采用双指针法:首先我们要对数组进行排序,我们开始遍历数组从0下标开始记为i,定义left指针为i+1,right指针为nums.length-1(最后一位),然后开始收集结果,如果我们的nums[i]+nums[left]+nums[right]<0则left指针右移一位,如果我们的nums[i]+num[j]+nums[left]+nums[right]>0则right指针左移一位,如果等于0则加入结果集中,但是这里有很多去重的细节,我们看以下代码中的解法。(在内层循环那个剪枝操作那里我们不能像第一层for循环那样直接返回result,因为可能第二层for循环里面还有我们想要的结果,你可以写为continue或者你直接不写也是一样的),这里真是个天坑,因为这里的i和j不是一直都是紧挨着的,它俩指针会越来越远的,这里需要注意一下

import java.util.*;
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums.length < 4) {
            return result;
        }
        Arrays.sort(nums);
        
        for (int i = 0; i < nums.length - 3; i++) {

            if(nums[i]>0 && nums[i]>target){
                return result;
            }
            
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            
            for (int j = i + 1; j < nums.length - 2; j++) {

                //这个地方真是个天坑,本人为此耗时俩个小时
                if (nums[i]+nums[j] > 0 && nums[i]+nums[j] > target) {
                    continue;
                }
                
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                
                int left = j + 1;
                int right = nums.length - 1;
                
                while (left < right) {
                    long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
                    
                    if (sum == target) {
                        result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
                        
                        // 跳过重复的元素
                        while (left < right && nums[left] == nums[left + 1]) {
                            left++;
                        }
                        while (left < right && nums[right] == nums[right - 1]) {
                            right--;
                        }
                        
                        left++;
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        right--;
                    }
                }
            }
        }
        
        return result;
    }
}

标签:四数,target,nums,18,right,result,&&,left
From: https://www.cnblogs.com/dfj-blog/p/18344115

相关文章

  • WindowsUpdate 更新错误 0x80244018
     更新windows的时候遇到了下载进度始终0%的问题,在网上检索了好多办法,最后在这个回答下(WindowsUpdate更新错误0x80244018-MicrosoftCommunity)解决了这次问题。   当提醒重启计算机的时候,重启,同时会显示正在更新。开机后我的电脑显示已经更新到最新版本。 ......
  • ARC181
    切了D但不会C,使我的大脑旋转。A进行一个分类讨论。如果序列是有序的,答案自然为\(0\)。如果存在\(i\)使得\(p_i=i\)且\(i\)之前的数全小于\(i\),那么答案为\(1\),否则答案显然大于\(1\)。如果\(p_1\nen\),那么答案等于\(2\),先后对\(1\)和\(n\)操作即可,\(......
  • 【动态规划】力扣918. 环形子数组的最大和
    给定一个长度为n的环形整数数组nums,返回nums的非空子数组的最大可能和。环形数组意味着数组的末端将会与开头相连呈环状。形式上,nums[i]的下一个元素是nums[(i+1)%n],nums[i]的前一个元素是nums[(i-1+n)%n]。子数组最多只能包含固定缓冲区nu......
  • [ARC118C] Coprime Set 题解
    题目传送门(洛谷)题目传送门(atcoder)Step1理解题意输入一个数nnn要求你构造一个长度为n......
  • 18981 正方形和圆
    这个问题可以通过计算正方形和圆的面积并比较它们的大小来解决。正方形的面积可以通过边长的平方来计算,圆的面积可以通过半径的平方乘以π来计���。以下是使用C++的代码实现:#include<iostream>#include<cmath>usingnamespacestd;intmain(){  doubleL,R;  ......
  • 18989 卡片队列
    这个问题可以通过使用链表数据结构来解决。我们可以使用一个数组来存储每个卡片的左右邻居,然后对于每个插入操作,我们都更新相应的邻居信息。以下是使用C++的代码实现:#include<iostream>#include<vector>usingnamespacestd;structNode{  intleft,right;};......
  • springboot宠物在线领养系统-计算机毕业设计源码51181
    摘要随着社会对宠物领养服务的关注不断增加,宠物在线领养系统应运而生。这一系统的设计旨在满足用户对宠物领养的需求,同时借助电子商务行业的快速发展和技术进步,为用户和宠物领养机构提供便捷、安全的在线领养平台。通过充分利用Java的跨平台特性、SpringBoot框架的快速开发......
  • 洛谷P1842 [USACO05NOV] 奶牛玩杂技
    [USACO05NOV]奶牛玩杂技题目背景FarmerJohn养了\(N\)头牛,她们已经按\(1\simN\)依次编上了号。FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团的演出。可奶牛们很快发现她们那笨拙的蹄子根本无法在钢丝或晃动的的秋千上站稳(她们还尝试过把自己装在大炮里发射......
  • (峰绍)FU6831/11/18 QFN-48/LQFP 单片机嵌入式和可配置的三相BLDC/PMSM电机控制器场定向
    产品描述FU6831/11/18系列是一款集成电机控制引擎(ME)和8051内核的电机驱动专用芯片。ME集成FOC、MDU、LPF、PI、SVPWM/SPWM等诸多硬件模块,可硬件自动完成电机FOC/BLDC运算控制;8051内核用于参数配置和日常事务处理,双核并行工作实现各种高性......
  • ARC181题解(A-D)
    A-SortLeftandRight答案为0即已经排序。考虑答案为1的情况:一定是存在一个\(p\),使得\(\min_{i=1}^{p}a_i=p\)且\(a_p=p\),这时只要选择\(p\)即可。考虑答案为2的情况:如果\(a_1\neqn\operatorname{or}a_n\neq1\),一定可以通过先操作某个数,把\(1\)或者\(n\)......