题解 | #四数之和#

四数之和

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;
    }
}

全部评论

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
投了多少份简历才上岸
点赞 评论 收藏
分享
测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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