18. 四数之和

18. 四数之和

原题链接:

18. 四数之和

https://leetcode.cn/problems/4sum/description/

完成情况:

解题思路:

/**

* //HashMap只能记录key,value的结果

* //而不能记录产生这个结果的过程

*

* @param nums

* @param target

* @return

*/

复制代码
思路全在代码注释里

参考代码:

c 复制代码
package LeetCode算法题;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class __18四数之和 {
    /**
     *         //HashMap只能记录key,value的结果
     *         //而不能记录产生这个结果的过程
     *
     * @param nums
     * @param target
     * @return
     */
    public List<List<Integer>> fourSum(int[] nums, int target) {
        //参考之前的三数求和,以及四数直接结果求和,
        //难道是构造两两的两对,然后一个两对的集合,去和另外两个数去判断???
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        int len = nums.length;
        if (nums == null || len < 4){
            return res;
        }
        Arrays.sort(nums);  //初始先将所有元素排好序,这样可以避免混乱的找要求数字
        for (int i=0;i<len-3;i++){
            if (i>0 && nums[i] == nums[i-1]){   //从第二个数开始判断
                continue;       //并且去重
            }
            //取完重复之后,固定一个点,剩下指针指向三个节点
            //然后进行左右判断
            if ((long)nums[i] + nums[i + 3] + nums[i + 2] + nums[i+1] > target){
                break;      //如果最左边四个数还比target大,那么说明已经没有数满足target了。
            }
            if ((long)nums[i] + nums[len - 3] + nums[len - 2] + nums[len-1] < target){
                //nums[i] + nums[len - 3] + nums[len - 2] + nums[len-1]
                continue;   //+最大的三个数,如果还小于的话,那么说明nums[i]还可以左走
            }
            /*
            int Left = i+1,Right = len -1;
            while (Left < Right){
            同三个数比大小,但这里是四个数,因此还剩三个数,
            所以需要指出三个指针
             */
            for (int j = i+1;j<len-2;j++){
                if (j>i+1 && nums[j] == nums[j-1]){     //继续去重
                    continue;
                }
                if ((long)nums[i] + nums[j] + nums[j+1] + nums[j+2] > target){
                    //如果头四个数大于target
                    break;
                }
                if ((long)nums[i] + nums[j] + nums[len-2]+nums[len - 1] < target){
                    //如果定了指针的左边两个数 + 右边的两个数   小于target
                    continue;   //说明左边的数,小了
                }
                    /*
                        int Left = i+1,Right = len -1;
                        while (Left < Right){
                        同三个数比大小,但这里是四个数,因此还剩三个数,
                        所以需要指出三个指针
                     */
                //然后仿照三个数比大小,锁定left,right去模仿移动
                //此时的指针,分别是i,j,left,right
                int left = j+1,right = len - 1;
                while (left < right){
                    long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target){
                        res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                        while (left<right && nums[left] == nums[left+1]){
                            left++;
                        }
                        left++;
                        while (left < right && nums[right] == nums[right-1]){
                            right--;
                        }
                        right--;
                    }else if (sum<target) { //左边小了
                        left++;
                    }else {     //右边大了
                        right--;
                    }
                }
            }
        }
        return res;
    }
}

错误经验吸取

相关推荐
txinyu的博客3 分钟前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
搞笑症患者18 分钟前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
ComputerInBook21 分钟前
代数学基本概念理解——幺正矩阵(Unitary matrix)(酉矩阵?)
线性代数·矩阵·正交矩阵·幺正矩阵·酉矩阵
im_AMBER22 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记22 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
快手技术39 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱41 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
做科研的周师兄43 分钟前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
X在敲AI代码44 分钟前
leetcodeD3
数据结构·算法
余瑜鱼鱼鱼1 小时前
Java数据结构:从入门到精通(十一)
数据结构