1. 程式人生 > >給定一個n個整數的陣列S,是否存在S中的4個數,使得a + b + c + d = target。 在陣列中找出所有唯一的四元組,給出目標的總和。

給定一個n個整數的陣列S,是否存在S中的4個數,使得a + b + c + d = target。 在陣列中找出所有唯一的四元組,給出目標的總和。

本題源自LeetCode

------------------------------------------

思路1 :回溯法

超時

程式碼;

 vector<vector<int> > fourSum(vector<int> &num, int target) {
        vector<vector<int>> result;
        if(num.size()==0)
            return result;
        vector<int> path;
        sort(num.begin(),num.end());
        backPath(result,num,path,target,0);
        return result;
    }
    void backPath(vector<vector<int>>& result,vector<int>& num,vector<int> &path,int target,int start){
        if(path.size()==4&&target==0){
            result.push_back(path);
            return;
        }
        int pre=INT_MAX;
        for(int i=start;i<num.size();i++){
            if(pre==num[i])
                continue;
            path.push_back(num[i]);
            backPath(result,num,path,target-num[i],start+1);
            path.pop_back();
        }
    }

思路2:

非遞迴;先計算倆個值再從剩下的數中選倆個。

程式碼:

vector<vector<int> > fourSum(vector<int> &num, int target) {
        vector<vector<int>> result;
        if(num.size()==0)
            return result;
        int n=num.size();
        sort(num.begin(),num.end());  //對陣列排序
        for(int i=0;i<n-3;i++){
            for(int j=i+1;j<n;j++){
                int sum=target-num[i]-num[j];   //先計算倆個值的和
                int start=j+1;                  //再剩餘的數中找到倆個值滿足和等於給定值
                int end=n-1;
                while(start<end){
                    while(start<end&&num[start]+num[end]>sum)
                        end--;
                    if(start==end)
                        break;
                    if(num[start]+num[end]==sum){
                        vector<int> tmp={num[i],num[j],num[start],num[end]};
                        result.push_back(tmp);
                        while(start<end&&num[start]==num[start+1])
                            start++;
                    }
                    start++;
                }
                while(j<n-1&&num[j]==num[j+1])   //避免重複的值
                    j++;
            }
            while(i<n-1&&num[i]==num[i+1])
                i++;
        }
        return result;
    }


相關推薦

給定一個n整數陣列S是否存在S4個數使得a + b + c + d = target陣列所有唯一目標總和

本題源自LeetCode ------------------------------------------ 思路1 :回溯法 超時 程式碼; vector<vector<int> > fourSum(vector<int> &

php陣列面試題$arr1=array(1,2,3,4,5); $arr2=array('a','b','c','d','e');輸出要交叉輸出

<?php $arr1=array(1,2,3,4,5); $arr2=array('a','b','c','d','e'); for($i=0;$i<count($arr1);$i++) {echo $arr1[$i].$arr2[$i]; } /* $arr

leetcode-java.T016_threeSumClosest---給定包含n整數陣列S找到S的三整數從而使之和最接近給定的數,返回三整數總和.

<span style="color:#ff4635">敬請關注部落格,後期不斷更新優質博文,謝謝</span> package leetcode.T016_threeSumClosest; import java.util.Arrays; i

領口要求真的高/三數之和 給定一個包含 n 整數陣列 nums判斷 nums 是否存在三元素 abc 使得 a + b + c = 0 ?所有滿足條件且不重複的三元 注意:答

import itertools from functools import reduce l=[] l1=[-1,0,1,2,-1,-4] m=list(itertools.combinations(l1,3)) #為了拿出所有的三元組 數學組合

LeetCode 15題 : 給定一個包含 n 整數陣列 nums判斷 nums 是否存在三元素 abc 使得 a + b + c = 0 ?所有滿足條件且不重複的三元

import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test15CorrectSolution { public static void m

給定一個包含 n 整數陣列 nums判斷 nums 是否存在三元素 abc 使得 a + b + c = 0 ?所有滿足條件且不重複的三元

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4], 滿足要求的三元組集合為: [ [-1, 0, 1], [-1, -1, 2] ] 解題思路: 開始採取遍歷陣列方式然後判斷遍歷的三個數的索引是否相同再做相加判斷

6-3 簡單求和(10 分) 本題要求實現一個函式給定N整數的和

int Sum ( int List[], int N ){  int sum=0;  for(int i=0;i<N;i++)  {    sum+=List[i];  }  return sum;}list的L大寫還有N,就醬。

一百分制成績要求成績等級‘A’‘B’‘C’‘D’‘E’90分以上為A80~89為B70~79為C60~69為D60分以下為E.

#include<stdio.h> int main() { float score; char grade; printf("輸入學生的成績:\n"); scanf("%f",

流水線之1乘法器實現S=a*b*c*d(指兩器之間只有一個乘法器)

module cy4(input[3:0] a,b,c,d, input vld_in,//輸入有效指示訊號 input clk,rst_n, output reg[15:0] dout, output re

演算法題:假設一列火車一共經過10車站車站按順序為 A B C D E F G H I J 編寫一個程式自動計算剩餘的票

假設一列火車一共經過10個車站,車站按順序為 A B C D E F G H I J ,編寫一個程式,自動計算剩餘的票     要求:1 假設火車有100個座位        2.程式可以輸入購買車票的起始站與結束站        3.輸入後,程式輸出剩餘車票,       

執行緒1、2、3、4執行緒1的功能就是輸出1執行緒2的功能就是輸出2以此類推......... 現在有檔案A B C D,初始都為空現要讓檔案呈如下格式:A:1 2 3 4 1 2..

具體題目如下: 有四個執行緒1、2、3、4, 執行緒1的功能就是輸出1,執行緒2的功能就是輸出2, 以此類推.........  現在有四個檔案A B C D, 初始都為空。現要讓四個檔案呈如下格式: A:1 2 3 4 1 2.... B:2 3 4 1 2 3....

a,b,c,d,e,f六字母可以構成多少沒有重複的字串

這是一個排列組合問題 public class Test3_2 { // //求階乘,這個不需要了 // public static int factorial(int n) // { // int

String s = "a"+"b"+"c"+"d"共建立了多少物件?

String s1 = "a"; String s2 = s1+"b"; String s3 = "a"+"b"; System.out.println(s2=="ab"); System.out.println(s3=="ab"); 輸出結果為fals

JAVA 多執行緒使用LockCondition實現A,B,C,D依次執行實現排它同步通訊

package com.study; import java.util.concurrent.locks.Condition

N A B C D

通過 社會 網頁 困難 事情 nbsp bcd 的人 需要 滴滴跑腿NABCD分析 N需求 現在人懶,宅,需要幫他跑腿的,還有就是有事情忙,沒時間做。 A做法 現在很多人沒工作,而且也不會工作,幫人跑腿總該會吧,可以召集大量員工通過設計的app給人跑腿。 B好處 為社會增加

IP地址分為A,B,C,D,E五類

轉載出處:http://blog.csdn.net/alfredtofu/article/details/6995186 IP地址分為A,B,C,D,E五類。 網路號:用於識別主機所在的網路;主機號:用於識別該網路中的主機。 其中A

多執行緒迴圈列印A B C D

class ProducerThread1 extends Thread {      private UserEntity userEntity;      public ProducerT

String str = "a"+"b"+"c"+"d";一共建立了幾物件?

       前一段時間我參加了我們學校的招聘會,然後有個面試人員就問了我String str = "a"+"b"+"c"+"d"共建立了幾個物件。平時我知道String型別的字串可以疊加,但這個底層原理卻有些模糊。當時就想這是字串的疊加啊,肯定只建立了一個物件。信心滿滿的

輸入AAABBBBCCDDD統計A B C D各多少(結果是A3B4C2D3)

輸入AAABBBBCCDDD,統計A  B  C  D各多少(結果是A3B4C2D3) import java.util.Iterator; import java.util.Map; public class Test { public static void ma

字串替換 eg: str1="123%s456%s" str2={'a','b','c','d'}(將str1的%s替換成str2的字元)替換結果返回為:123a456bcd

//字串替換 //eg: str1=”123%s456%s” str2={‘a’,’b’,’c’,’d’}(將str1中的%s替換成str2中的字元)替換結果返回為:123a456bcd 程式碼塊