前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Sum

作者头像
yesr
发布2019-03-14 13:03:27
5460
发布2019-03-14 13:03:27
举报
文章被收录于专栏:leetcode_solutionsleetcode_solutions

【题目描述】

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.  Note:   Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d) 

  The solution set must not contain duplicate quadruplets.

For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

   A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)

【题目大意】

给定一个整数数组,找出a + b + c + d = target的唯一解。

【本题答案】

代码语言:javascript
复制
package blog;

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

/**
 * @author yesr
 * @create 2018-04-20 下午11:59
 * @desc
 **/
public class Test0420 {
    public List<List<Integer>> fourSum(int[] num, int target) {
        List<List<Integer>> result = new LinkedList<>();
        if (num == null || num.length < 4) {
            return result;
        }

        Arrays.sort(num); // 对数组进行排序

        for (int i = 0; i < num.length - 3; i++) { // 第一个加数
            if ( i > 0 && num[i] == num[i - 1]) { // 第一个加数使用不重复
                continue;
            }

            for (int j = num.length - 1; j > i + 2 ; j--) { // 第四个加数
                if (j < num.length - 1 && num[j] == num[j + 1]) { // 第四个加数使用不重复
                    continue;
                }

                int start = i + 1; // 第二个加数
                int end = j - 1; // 第三个加数
                int n = target - num[i] - num[j];

                while (start < end) {
                    if (num[start] + num[end] == n) {
                        List<Integer> four = new ArrayList<>(4);
                        four.add(num[i]);
                        four.add(num[start]);
                        four.add(num[end]);
                        four.add(num[j]);

                        result.add(four);

                        do {
                            start++;
                        } while (start< end && num[start] == num[start - 1]); // 保证再次使用第二个数不重复

                        do {
                            end--;
                        } while (start < end && num[end] == num[end + 1]); // 保证再次使用第三个数不重复
                    } else if (num[start] + num[end] < n) {
                        do {
                            start++;
                        } while (start< end && num[start] == num[start - 1]); // 保证再次使用第二个数不重复
                    } else {
                        do {
                            end--;
                        } while (start < end && num[end] == num[end + 1]); // 保证再次使用第三个数不重复
                    }
                }
            }
        }


        return result;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档