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

力扣18 四数之和

时间:2022-12-04 21:35:54浏览次数:48  
标签:四数 target nums int 18 力扣 right && 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
你可以按 任意顺序 返回答案 。

示例:

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

双指针法:

两层循环,指向第一个数和第二个数,其余操作和三数之和相似。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result=new  ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            if(nums[i] > 0 &&nums[i]>target){//如果target是-2,num[i]为-1,nums[i+1]也是-1,则四元组还有希望
                return result;
            }
            if(i>0&&nums[i]==nums[i-1]){ // 对nums[i]去重
                continue;//其实就是直接i++
            }
            for(int j=i+1;j<nums.length;j++){
                if (j > i + 1 && nums[j - 1] == nums[j]) {  // 对nums[j]去重
                    continue;
                }
                int left=j+1;//j右边
                int right=nums.length-1;
                while(right>left){
                    // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
                    long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];
                    if(sum>target){
                        right--;
                    }else if(sum<target){
                        left++;
                    }else{
                        result.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                        while(right>left&&nums[right]==nums[right-1]){right--;}
                        while(right>left&&nums[left]==nums[left+1]){left++;}
                        right--;
                        left++;
                    }
                }
            }
        }
        return result;
    }
}

 

标签:四数,target,nums,int,18,力扣,right,&&,left
From: https://www.cnblogs.com/cjhtxdy/p/16950862.html

相关文章

  • 力扣 leetcode 547. 省份数量
    问题描述有n个城市,其中一些彼此相连,另一些没有相连。如果城市a与城市b直接相连,且城市b与城市c直接相连,那么城市a与城市c间接相连。省份是一组直接或间接......
  • 力扣 leetcode 200. 岛屿数量
    问题描述给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此......
  • 18.【C语言进阶】程序的编译
    程序的翻译环境和执行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行......
  • 力扣刷题01
    704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:num......
  • win10安装wsl1的ubuntu18.04
    1.需求主系统:win10子系统:ubuntu18.04,要求wsl1,并且系统默认登录账户为没有密码的root根账户2.步骤(1)启用“适用于Linux的Windows子系统”可选功能在Windows中修改......
  • 每日食词—day018
    singletonn.单件、单例whetherconj. pron.是否、有无、无论、不管targetn.目标、指标supernettingn.超网constn.常量、常数、固定unitn.单位......
  • 2022-2023-1 20221418 《计算机基础与程序设计》第十四周学习总结
    2022-2023-120221418《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里(2022-20......
  • Ubuntu18.04安装docker
    一、安装1.更新源sudoapt-getupdate2.安装依赖:sudoapt-getinstallapt-transport-httpsca-certificatescurlgnupg2software-properties-common3.信任Do......
  • 基于CV1811C uboot显示logo
    1.根据原理图在dts中配置panel的reset、power等管脚,uboot和kernel吃的是同一份dts2.panel初始化参数在u-boot-2021.10/include/cvitek/cvi_panels/dsi_hx8394_evb.h......
  • 力扣 leetcode 438. 找到字符串中所有字母异位词
    问题描述给定两个字符串s和p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字......