18. 4Sum (通用算法 nSum)

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)

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */

int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
    quickSort(nums, 0, numsSize-1);

    int* elem = malloc(sizeof(int)*4);
    int** returnArray = malloc(sizeof(int*)*1000);
    nSum(nums, numsSize, target, elem, returnArray, returnSize, 4);
    return returnArray;
}

void twoSum(int* nums, int numsSize, int target, int* elem, int** returnArray, int* returnSize){
        int j = 0;
        int k = numsSize-1;
        while(j<k){
            if(nums[j]+nums[k] < target) j++;
            else if(nums[j]+nums[k] > target) k--;
            else{
               elem[2] = nums[j];
               elem[3] = nums[k];

               int* returnElem = malloc(sizeof(int)*4);
               memcpy(returnElem, elem,sizeof(int)*4);

               returnArray[*returnSize] = returnElem;
               (*returnSize)++;

               j++;
               k--;
               while(j<k && nums[j]==nums[j-1]) j++; //To avoid duplicate triplets
               while(j<k && nums[k]==nums[k+1]) k--;

            }
        }
}

void nSum(int* nums, int numsSize, int target, int* elem, int** returnArray, int* returnSize, int N){
    if(N<=2) {
        twoSum(nums, numsSize, target, elem, returnArray, returnSize);
        return;
    }

    N--;
    for(int i = 0; i < numsSize-N; i++){
        elem[4-N-1] = nums[i];
        nSum(nums+i+1, numsSize-i-1, target-nums[i], elem, returnArray, returnSize, N);
        while(nums[i+1]==nums[i]) i++; //To avoid duplicate triplets
    }
}

void quickSort(int* nums, int start, int end){
    int p1 = start+1;
    int p2 = end;
    int tmp;

    while(p1 <= p2){
        while(p1 <= p2 && nums[p1] <= nums[start]){
            p1++;
        }
        while(p1 <= p2 && nums[p2] > nums[start]){
            p2--;
        }
        if(p1 < p2){
            tmp = nums[p1];
            nums[p1] = nums[p2];
            nums[p2] = tmp;
            p1++;
            p2--;
        }
    }

    //put the sentinel at the end of the first subarray
    if(start!=p2){
    tmp = nums[start];
    nums[start] = nums[p2];
    nums[p2] = tmp;
    }

    if(start < p2-1) quickSort(nums,start, p2-1); //sort first subarray (<=sentinel)
    if(p1 < end) quickSort(nums,p1, end); //sort second subarray  (>sentinel)
}
时间: 2024-11-11 01:02:30

18. 4Sum (通用算法 nSum)的相关文章

数据结构通用算法(深拷贝+比较)

1 public class CompareIgnoreAttribute : Attribute 2 { 3 }; 4 5 [Serializable] // 深拷贝需要 6 public abstract class DataInfo 7 { 8 // 快速深拷贝 9 public static object copy(object th) 10 { 11 MemoryStream ms = new MemoryStream(); 12 BinaryFormatter bf = new Bi

Qt学习之路(49): 通用算法

今天开始的部分是关于Qt提供的一些通用算法.这部分内容来自C++ GUI Programming with Qt 4, 2nd Edition. <QtAlgorithms>提供了一系列通用的模板函数,用于实现容器上面的基本算法.这部分算法很多依赖于STL风格的遍历器(还记得前面曾经说过的Java风格的遍历器和STL风格的遍历器吗?).实际上,C++ STL也提供了很多通用算法,包含在<algorithm>头文件内.这部分算法对于Qt容器同样也是适用的.因此,如果你想使用的算法在Q

1. Two Sum&amp;&amp;15. 3Sum&amp;&amp;18. 4Sum

题目: 1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Given nums = [2, 7, 1

一步一步写算法(之通用算法的编写)

原文:一步一步写算法(之通用算法的编写) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们写过各种各样的算法,什么排序.查找.二叉树.队列.堆栈等等.但是我们在编写这些代码的时候却都有一个缺点,不知道大家发现了没有?那就是这些算法中使用的数据结构都是简单的int数据.所以,如果排序的是int,那么用起来没有什么问题.关键就是万一是其他的数据类型,那我们应该怎么办呢? 在c++中,有一种解决的方法.那就是类函数.就拿冒泡排序来说,我

第56件事 排行榜通用算法4步

自从跟随师傅学艺之后,也爱上了看书,比较好奇,各大电商网站的图书排行榜排名到底是依据什么因素或维度来排列的?怎么样的排名算法算是比较科学的呢?有没有比较通用的算法?师傅肯定有方法.还真是,咨询师傅后,得知还真有通用的排名算法. 通用型的排行榜算法一共分为四步:第一步明确影响排行榜的维度或因素:第二步将每个维度或因素的数值标准化:第三步确定每个维度或因素的权重比:第四步计算综合评分后进行排名. 我们以一个具体的实例来阐述一下.假设现在有20个苹果供用户白吃或试吃,游戏规则是团长通过微信好友或朋友圈

18. 4Sum(js)

18. 4Sum Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution set must not cont

LeetCode 18. 4Sum (四数之和)

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: The solution set must not contain duplicate quadruplets. For exampl

[LeetCode][Python]18: 4Sum

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 18: 4Sumhttps://oj.leetcode.com/problems/4sum/ 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

LeetCode——18. 4Sum

一.题目链接:https://leetcode.com/problems/4sum/ 二.题目大意: 给定一个数组A和一个目标值target,要求从数组A中找出4个数来使之构成一个4元祖,使得这四个数的和等于target,找出所有的四元组,当然这些四元组不能有重复的. 三.题解: 这道题实质就是3sum的变形,关于4sum问题,已经在https://www.cnblogs.com/wangkundentisy/p/9079622.html这里说过了,无外乎最外面两层循环,最里面的循环使用哈希表或