题解 | #四数之和#

四数之和

https://www.nowcoder.com/practice/d5b74806fa104518903884e182f47e35

import java.util.*;

/**
 * NC348 四数之和
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 相似 -> NC247 最接近的三数之和 [nowcoder]
     *
     * @param nums int整型ArrayList
     * @param target int整型
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> fournumber (ArrayList<Integer> nums, int target) {
        // return solution1(nums, target);
        return solution2(nums, target);
        // return solution3(nums, target);
    }

    /**
     * 排序+四指针(固二动二)
     * @param nums
     * @param target
     * @return
     */
    private ArrayList<ArrayList<Integer>> solution1(ArrayList<Integer> nums, int target){
        int n = nums.size();

        // 排序
        Collections.sort(nums);

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        ArrayList<Integer> list;
        HashSet<ArrayList<Integer>> set = new HashSet<>();

        int p,q;
        int sum;
        // 固二: i j
        for(int i=0; i<n; i++){
            for(int j=i+1; j<n; j++){
                p = j+1;
                q = n-1;
                // 动二: p q
                while(p < q){
                    sum = nums.get(i)+nums.get(j)+nums.get(p)+nums.get(q);
                    if(sum < target){
                        p++;
                    }else if(sum > target){
                        q--;
                    }else{
                        list = new ArrayList<>();
                        list.add(nums.get(i));
                        list.add(nums.get(j));
                        list.add(nums.get(p));
                        list.add(nums.get(q));
                        // 去重
                        set.add(list);
                        // 去重
                        while(++p < q){
                            if(!nums.get(p).equals(nums.get(p-1))){
                                break;
                            }
                        }
                        // 去重
                        while(p < --q){
                            if(!nums.get(q).equals(nums.get(q+1))){
                                break;
                            }
                        }
                    }
                }
            }
        }

        result.addAll(set);

        return result;
    }

    /**
     * 排序+四指针(固二动二)
     * @param nums
     * @param target
     * @return
     */
    private ArrayList<ArrayList<Integer>> solution2(ArrayList<Integer> nums, int target){
        int n = nums.size();

        // 排序
        Collections.sort(nums);

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        ArrayList<Integer> list;

        int p,q;
        int sum;
        // 固二: i j
        for(int i=0; i<n; i++){
            // 去重
            if(i>0 && nums.get(i).equals(nums.get(i-1))){
                continue;
            }
            for(int j=i+1; j<n; j++){
                // 去重
                if(j>i+1 && nums.get(j).equals(nums.get(j-1))){
                    continue;
                }
                p = j+1;
                q = n-1;
                // 动二: p q
                while(p < q){
                    sum = nums.get(i)+nums.get(j)+nums.get(p)+nums.get(q);
                    if(sum < target){
                        p++;
                    }else if(sum > target){
                        q--;
                    }else{
                        list = new ArrayList<>();
                        list.add(nums.get(i));
                        list.add(nums.get(j));
                        list.add(nums.get(p));
                        list.add(nums.get(q));
                        result.add(list);
                        // 去重
                        while(++p < q){
                            if(!nums.get(p).equals(nums.get(p-1))){
                                break;
                            }
                        }
                        // 去重
                        while(p < --q){
                            if(!nums.get(q).equals(nums.get(q+1))){
                                break;
                            }
                        }
                    }
                }
            }
        }

        return result;
    }

    /**
     * 排序+四指针(固二动二)
     * @param nums
     * @param target
     * @return
     */
    private ArrayList<ArrayList<Integer>> solution3(ArrayList<Integer> nums, int target){
        int n = nums.size();

        // 排序
        Collections.sort(nums);

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        ArrayList<Integer> list;

        int p,q;
        int sum;
        // 固二: i j
        for(int i=0; i<n; i++){
            // 去重
            if(i>0 && nums.get(i).equals(nums.get(i-1))){
                continue;
            }
            for(int j=i+1; j<n; j++){
                // 去重
                if(j>i+1 && nums.get(j).equals(nums.get(j-1))){
                    continue;
                }
                p = j+1;
                q = n-1;
                // 动二: p q
                while(p < q){
                    // 去重
                    while(p>j+1 && p<n && nums.get(p).equals(nums.get(p-1))){
                        p++;
                    }
                    if(p >= q){
                        break;
                    }
                    sum = nums.get(i)+nums.get(j)+nums.get(p)+nums.get(q);
                    if(sum < target){
                        p++;
                    }else if(sum > target){
                        q--;
                    }else{
                        list = new ArrayList<>();
                        list.add(nums.get(i));
                        list.add(nums.get(j));
                        list.add(nums.get(p));
                        list.add(nums.get(q));
                        result.add(list);
                        p++;
                    }
                }
            }
        }

        return result;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:06
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务