Bir dizide toplamı belirli bir sayıya en yakın olan üç öğeyi bulma


155

Negatifler ve pozitifler ve başka bir tamsayı dahil olmak üzere bir tamsayı dizisi, A 1 , A 2 , ..., A n ve başka bir tamsayı S verildi. Şimdi dizide toplamı verilen tamsayı S'ye en yakın olan üç farklı tamsayı bulmamız gerekiyor. Birden fazla çözüm varsa, bunlardan herhangi biri sorun değildir.

Tüm tam sayıların int32_t aralığında olduğunu ve toplamı hesaplarken aritmetik taşma gerçekleşmeyeceğini varsayabilirsiniz. S rastgele seçilmiş bir sayıdan başka özel bir şey değildir.

Üç tamsayıyı bulmak için kaba kuvvet arama dışında verimli bir algoritma var mı?


1
Bir sayıya eşit (ve en yakın değil) bir toplam arıyorsanız, bu 3SUM sorunu olacaktır .
Bernhard Barker

Yanıtlar:


186

Üç tamsayıyı bulmak için kaba kuvvet arama dışında verimli bir algoritma var mı?

Evet; Bunu O (n 2 ) zamanda çözebiliriz ! İlk olarak, sorununuzun P"hedef değer" ihtiyacını ortadan kaldıran, biraz farklı bir şekilde eşdeğer olarak ifade edilebileceğini düşünün :

Özgün sorun P: bir dizi Verilen Aait ntamsayılar ve bir hedef değer S, yürüyerek 3 tuple orada var yok Ao özetliyor S?

tadil edilmiş bir sorun P': bir dizi göz önüne alındığında Aarasında nbir 3-tuple orada halen mevcut, tam sayılar Asıfır olduğu toplamlarının?

Sorunun bu sürümden gidebilirsiniz Bildirimi P'gelen Pher elemanın adresinin S / 3 çıkarılarak A, ama şimdi artık hedef değeri gerekmez.

Açıkçası, tüm olası 3 tüpleri test edersek, sorunu O (n 3 ) 'te çözerdik - bu kaba kuvvet temelidir. Daha iyisini yapmak mümkün mü? Tupleleri biraz daha akıllıca seçersek ne olur?

İlk olarak, diziyi sıralamak için biraz zaman harcıyoruz, bu da bize O (n log n) 'nin ilk cezasına mal oluyor. Şimdi bu algoritmayı yürütüyoruz:

for (i in 1..n-2) {
  j = i+1  // Start right after i.
  k = n    // Start at the end of the array.

  while (k >= j) {
    // We got a match! All done.
    if (A[i] + A[j] + A[k] == 0) return (A[i], A[j], A[k])

    // We didn't match. Let's try to get a little closer:
    //   If the sum was too big, decrement k.
    //   If the sum was too small, increment j.
    (A[i] + A[j] + A[k] > 0) ? k-- : j++
  }
  // When the while-loop finishes, j and k have passed each other and there's
  // no more useful combinations that we can try with this i.
}

Bu algoritma, üç işaretçiler, yerleştirir ve i, jve kdizi içinde çeşitli noktalarda. ibaşlangıçta başlar ve yavaş yavaş sonuna kadar gider. kson öğeye işaret eder. jnereden ibaşladığını gösterir. Öğeleri tekrar tekrar kendi endekslerinde toplamaya çalışıyoruz ve her seferinde aşağıdakilerden biri gerçekleşiyor:

  • Toplam kesinlikle doğru! Cevabı bulduk.
  • Toplam çok küçüktü. Taşı jsonraki en büyük sayı seçmek daha yakın ucuna.
  • Toplam çok büyüktü. Taşı ksonraki en küçük numarayı seçmek daha yakın başlangıcına.

Her biri için i, bir işaretçi jve kyavaş yavaş daha yakın birbirine alacak. Sonunda birbirlerini geçecekler ve bu noktada bunun için başka bir şey denememiz gerekmiyor i, çünkü aynı unsurları sadece farklı bir düzende toplayacağız. Bu noktadan sonra bir sonrakini dener ive tekrarlarız.

Sonunda, ya yararlı olanakları tüketeceğiz ya da çözümü bulacağız. Dış döngü O (n) kez yürüttüğümüz ve iç döngü O (n) kez yürüttüğümüz için bunun O (n 2 ) olduğunu görebilirsiniz . Gerçekten süslü olursanız, her bir tamsayıyı bir bit vektörü olarak temsil ederek ve hızlı bir Fourier dönüşümü gerçekleştirerek bunu alt karesel olarak yapmak mümkündür, ancak bu, bu cevabın kapsamı dışındadır.


Not: Bu bir röportaj sorusu olduğundan, burada biraz hile yaptım: bu algoritma aynı öğenin birden çok kez seçilmesine izin veriyor. Yani, (-1, -1, 2) (0, 0, 0) gibi geçerli bir çözüm olacaktır. Ayrıca başlıktan da bahsedildiği gibi en yakın cevabı değil, sadece kesin cevapları bulur . Okuyucu için bir alıştırma olarak, onu sadece farklı öğelerle (ancak çok basit bir değişiklik) ve kesin cevapları (aynı zamanda basit bir değişikliktir) nasıl çalıştıracağınızı anlamanıza izin vereceğim.


8
Algoritma sadece 3 kayıt düzeni bulabilirsiniz görünüyor eşittir S, değil yakın S.
ZelluX

7
ZelluX: Notta belirttiğim gibi, bu bir röportaj problemi olduğu için çok fazla vermek istemedim. Umarım nasıl değiştireceğinizi görebilirsiniz, böylece size en yakın cevabı alır. (İpucu: Bir yol, şimdiye kadarki en yakın cevabı takip etmek ve daha iyi bir cevap bulursanız üzerine
yazmaktır

12
sorun ifadesini değiştirmezsek, bunun yerine ai + S için toplamı aj ve ak arayacağız.
Boolean

3
@ZelluX: Bir birleştirme sıralamasının nasıl çalıştığına benzer (benim için ilk tıklatması). Bu iç halkanın yapmaya çalıştığı şey, A [j] veya A [k] 'nın herhangi bir tatmin edici çözümün parçası olamayacağını kanıtlamaktır . Herhangi bir noktada sorun: "A [j] + A [k] = S - A [i] olacak şekilde j '> = j ve k' <= k çifti var mı?" Mevcut çifte baktığımda (i, j) 3 olasılık var: toplam patlama açık (dur - kazandık!), Çok düşük veya çok yüksek. Çok düşükse, A [j] + A [k '] toplamı da her k' <= k için çok düşük olmalıdır , çünkü her bir toplamda ilk terim (A [j]) aynı olacaktır. ..
j_random_hacker

1
... ve ikinci terim (A [k ']) A [k] ile aynı veya hatta daha düşük olacaktır. Bu durumda, A [j] 'ın herhangi bir tatmin edici tutara katılamayacağını kanıtladık - bu yüzden de atabiliriz! Bunu j = j + 1'i ayarlayıp baştan başlayarak yapıyoruz (bunun yerine, daha küçük bir alt problemi özyinelemeli olarak çözmeyi düşünmek yardımcı olabilir). Benzer şekilde A [j] + A [k] toplamı çok yüksekse, A [j '] + A [k] ' nın her j '> = j için de çok yüksek olması gerektiğini biliyoruz , çünkü A [j'] en azından A [j] kadar büyük olmalı ve biz zaten çok yüksekiz. Bu, k = k-1 ayarlayıp baştan başlayarak A [k] 'yı güvenle atabileceğimiz anlamına gelir.
j_random_hacker

28

kesinlikle bu daha iyi bir çözümdür çünkü okunması daha kolaydır ve bu nedenle hatalara daha az eğilimlidir. Tek sorun, bir öğenin birden fazla seçimini önlemek için birkaç satır kod eklememiz gerekiyor.

Başka bir O (n ^ 2) çözeltisi (bir hashset kullanarak).

// K is the sum that we are looking for
for i 1..n
    int s1 = K - A[i]
    for j 1..i
        int s2 = s1 - A[j]
        if (set.contains(s2))
            print the numbers
    set.add(A[i])

8
Olumsuz, yerinde yapmak yerine O (N) depolamasıdır.
Charles Munger

6
Bir karma kümesinin kullanılması katı O (n ^ 2) değildir, çünkü karma küme nadir durumlarda dejenere olabilir ve bu da doğrusal arama sürelerine kadar çıkabilir.
Ext3h

@Charles - Sıralama sırasında orijinal diziyi değiştirdiğiniz için John'un çözümü de O (N) alanına ihtiyaç duyar. Bu, arayanın işlevi kullanmadan önce savunma amaçlı bir kopyaya ihtiyacı olabileceği anlamına gelir.
gamliela

Bence algoritmanızda bir hata var. s2önceden seçilmiş bir öğe olabilir. Örneğin dizi ise 0,1,2ve Kise 2, bir cevap olmamalıdır. Bence algoritmanız çıkacak 0,1,1ki bu yanlış.
Yamcha

7

John Feminella'nın çözümünün bir hatası var.

Hatta

if (A[i] + A[j] + A[k] == 0) return (A[i], A[j], A[k])

İ, j, k'nin farklı olup olmadığını kontrol etmeliyiz. Aksi takdirde, hedef öğem 6varsa ve girdi dizim içeriyorsa {3,2,1,7,9,0,-4,6}. 6'ya ulaşan tüpleri yazdırırsam 0,0,6, çıktı olarak da alırım . Bundan kaçınmak için, durumu bu şekilde değiştirmemiz gerekir.

if ((A[i] + A[j] + A[k] == 0) && (i!=j) && (i!=k) && (j!=k)) return (A[i], A[j], A[k])

2
John Feminella çözümü sadece sorunu çözmek için algoritma sunmaktır, ayrıca çözümünün farklı sayı koşulu için işe yaramayacağını ve okuyucu için bıraktığı yukarıdaki kodu biraz değiştirmek zorunda olduğunu da belirtmiştir.
EmptyData

3
Aslında, j = i + 1'de her zaman başlattığınız için asla j olmayacağım. Kontrol etmeniz gereken tek gerçek durum j == k olup olmadığıdır. Ancak while döngüsünü j <k olarak ayarlayarak, uzun bir if ifadesi olmadan problemleri çözmüşsünüz, çünkü k her zaman j'den büyük olacaktır ve j her zaman i'den büyük olacaktır.
lorenzocastillo

2
Bu, sorunun cevabı gibi değil, John Feminella'nın cevabı hakkında bir yorum gibi görünüyor.
Bernhard Barker

6

Böyle bir şeye ne dersin, O (n ^ 2)

for(each ele in the sorted array)
{
    ele = arr[i] - YOUR_NUMBER;
    let front be the pointer to the front of the array;
    let rear be the pointer to the rear element of the array.;

    // till front is not greater than rear.                    
    while(front <= rear)
    {
        if(*front + *rear == ele)
        {
            print "Found triplet "<<*front<<","<<*rear<<","<<ele<<endl;
            break;
        }
        else
        {
            // sum is > ele, so we need to decrease the sum by decrementing rear pointer.
            if((*front + *rear) > ele)
                decrement rear pointer.
            // sum is < ele, so we need to increase the sum by incrementing the front pointer.
            else
                increment front pointer.
        }
    }

Bu, 3 öğenin toplamının tam olarak numaranıza eşit olup olmadığını bulur. En yakınını istiyorsanız, en küçük deltayı (geçerli üçlü sayınız arasındaki fark) hatırlamak ve sonunda en küçük deltaya karşılık gelen üçlüyü yazdırmak için değiştirebilirsiniz.


toplamı almak için k elementleri bulmak istiyorsanız karmaşıklık nedir? Bununla nasıl başa çıkıyorsunuz?
coder_15

Bu yaklaşımla, k öğelerinin karmaşıklığı k> = 2 için O (n ^ (k-1)) 'dir. Her ek toplama için bir dış döngü eklemeniz gerekir.
Ext3h

5

Sıralı bir dizimiz olduğunu unutmayın. Bu çözüm, yalnızca toplamı aradığı ve aynı öğeyi tekrarlamadığı için John'un çözümüne benzer.

#include <stdio.h>;

int checkForSum (int arr[], int len, int sum) { //arr is sorted
    int i;
    for (i = 0; i < len ; i++) {
        int left = i + 1;
        int right = len - 1;
        while (right > left) {
            printf ("values are %d %d %d\n", arr[i], arr[left], arr[right]);
            if (arr[right] + arr[left] + arr[i] - sum == 0) {
                printf ("final values are %d %d %d\n", arr[i], arr[left], arr[right]);
                return 1;
            }
            if (arr[right] + arr[left] + arr[i] - sum > 0)
                right--;
            else
                left++;
        }
    }
    return -1;
}
int main (int argc, char **argv) {
    int arr[] = {-99, -45, -6, -5, 0, 9, 12, 16, 21, 29};
    int sum = 4;
    printf ("check for sum %d in arr is %d\n", sum, checkForSum(arr, 10, sum));
}

Mutlak farkını hesaplamak gerekir a[r] + a[l] + a[i] - sum. Deneyin arr = [-1, 2, 1, -4] sum = 1.
Dimitry

3

İşte C ++ kodu:

bool FindSumZero(int a[], int n, int& x, int& y, int& z)
{
    if (n < 3)
        return false;

    sort(a, a+n);

    for (int i = 0; i < n-2; ++i)
    {
        int j = i+1;
        int k = n-1;

        while (k >= j)
        {
            int s = a[i]+a[j]+a[k];

            if (s == 0 && i != j && j != k && k != i)
            {
                x = a[i], y = a[j], z = a[k];
                return true;
            }

            if (s > 0)
                --k;
            else
                ++j;
        }
    }

    return false;
}

2

Çok basit N ^ 2 * logN çözümü: giriş dizisini sıralayın, ardından A i , A j (N ^ 2 kez) tüm çiftlerini gözden geçirin ve her bir çift için (S - A i - A j ) dizisinde ( logN zamanı).

Başka bir O (S * N) çözümü klasik dinamik programlama yaklaşımını kullanır .

Kısacası:

2 boyutlu bir dizi V [4] [S + 1] oluşturun. Öyle bir şekilde doldurun, ki:

V [0] [0] = 1, V [0] [x] = 0;

V 1 [A i ] = 1 herhangi bir i için, V 1 [x] = 0 diğer tüm x için

V [2] [A i + A j ] = 1, herhangi bir i, j için. V [2] [x] = diğer tüm x için 0

V [3] [herhangi bir 3 öğenin toplamı] = 1.

A aracılığıyla, iterate doldurmak için ben her A için, ben sağdan sola doğru dizi üzerinden yinelerler.


ilk algoritmada küçük bir değişiklik ... eğer eleman mevcut değilse, ikili aramanın sonunda, hangisinin en yakın sonucu verdiğini görmek için sol, akım ve sağdaki öğeye bakmamız gerekir. .
Anurag

Dizi çok büyük ve O (s * N) değil. Bu adım O (N ^ 2): V [2] [Ai + Aj] = 1, herhangi bir i, j için. V [2] [x] = 0, diğer tüm x için.
Richard

1

Bu, O (n log (n)) içinde aşağıdaki gibi verimli bir şekilde çözülebilir. Üç sayının toplamının belirli bir sayıya eşit olup olmadığını söyleyen bir çözüm veriyorum.

import java.util.*;
public class MainClass {
        public static void main(String[] args) {
        int[] a = {-1, 0, 1, 2, 3, 5, -4, 6};
        System.out.println(((Object) isThreeSumEqualsTarget(a, 11)).toString());
}

public static boolean isThreeSumEqualsTarget(int[] array, int targetNumber) {

    //O(n log (n))
    Arrays.sort(array);
    System.out.println(Arrays.toString(array));

    int leftIndex = 0;
    int rightIndex = array.length - 1;

    //O(n)
    while (leftIndex + 1 < rightIndex - 1) {
        //take sum of two corners
        int sum = array[leftIndex] + array[rightIndex];
        //find if the number matches exactly. Or get the closest match.
        //here i am not storing closest matches. You can do it for yourself.
        //O(log (n)) complexity
        int binarySearchClosestIndex = binarySearch(leftIndex + 1, rightIndex - 1, targetNumber - sum, array);
        //if exact match is found, we already got the answer
        if (-1 == binarySearchClosestIndex) {
            System.out.println(("combo is " + array[leftIndex] + ", " + array[rightIndex] + ", " + (targetNumber - sum)));
            return true;
        }
        //if exact match is not found, we have to decide which pointer, left or right to move inwards
        //we are here means , either we are on left end or on right end
        else {

            //we ended up searching towards start of array,i.e. we need a lesser sum , lets move inwards from right
            //we need to have a lower sum, lets decrease right index
            if (binarySearchClosestIndex == leftIndex + 1) {
                rightIndex--;
            } else if (binarySearchClosestIndex == rightIndex - 1) {
                //we need to have a higher sum, lets decrease right index
                leftIndex++;
            }
        }
    }
    return false;
}

public static int binarySearch(int start, int end, int elem, int[] array) {
    int mid = 0;
    while (start <= end) {
        mid = (start + end) >>> 1;
        if (elem < array[mid]) {
            end = mid - 1;
        } else if (elem > array[mid]) {
            start = mid + 1;
        } else {
            //exact match case
            //Suits more for this particular case to return -1
            return -1;
        }
    }
    return mid;
}
}

Bunun işe yarayacağını sanmıyorum. Verilen, nasıl ilerleyeceğiniz leftIndexveya rightIndexortadaki tüm elemanların istediğiniz sayıdan kesinlikle daha küçük veya daha büyük olduğu konusunda iki basit vakanız var . Fakat ikili aramanın ortada bir yerde durduğu durum ne olacak? Her iki dalı da kontrol etmeniz gerekir (nerede rightIndex--ve leftIndex++). Çözümünüzde bu durumu görmezden geliyorsunuz. Ancak bu sorunun üstesinden gelmenin bir yolu olduğunu düşünmüyorum.
Ağustos'ta

0

Azaltma: Sanırım @John Feminella çözeltisi O (n2) en zarif. Hala tuple aramak için A [n] değerini azaltabiliriz. A [k] 'yı gözlemleyerek, arama dizimiz çok büyük ve SUM (s) gerçekten küçük olduğunda tüm elemanlar A [0] - A [k]' da olur.

A [0] minimumdur: - Artan sıralanmış dizi.

s = 2A [0] + A [k]: s ve A [] verildiğinde log (n) zamanında ikili aramayı kullanarak A [k] bulabiliriz.


0

Java'da O (N ^ 2) olan program

import java.util.Stack;


public class GetTripletPair {

    /** Set a value for target sum */
    public static final int TARGET_SUM = 32;

    private Stack<Integer> stack = new Stack<Integer>();

    /** Store the sum of current elements stored in stack */
    private int sumInStack = 0;
    private int count =0 ;


    public void populateSubset(int[] data, int fromIndex, int endIndex) {

        /*
        * Check if sum of elements stored in Stack is equal to the expected
        * target sum.
        * 
        * If so, call print method to print the candidate satisfied result.
        */
        if (sumInStack == TARGET_SUM) {
            print(stack);
        }

        for (int currentIndex = fromIndex; currentIndex < endIndex; currentIndex++) {

            if (sumInStack + data[currentIndex] <= TARGET_SUM) {
                ++count;
                stack.push(data[currentIndex]);
                sumInStack += data[currentIndex];

                /*
                * Make the currentIndex +1, and then use recursion to proceed
                * further.
                */
                populateSubset(data, currentIndex + 1, endIndex);
                --count;
                sumInStack -= (Integer) stack.pop();
            }else{
            return;
        }
        }
    }

    /**
    * Print satisfied result. i.e. 15 = 4+6+5
    */

    private void print(Stack<Integer> stack) {
        StringBuilder sb = new StringBuilder();
        sb.append(TARGET_SUM).append(" = ");
        for (Integer i : stack) {
            sb.append(i).append("+");
        }
        System.out.println(sb.deleteCharAt(sb.length() - 1).toString());
    }

    private static final int[] DATA = {4,13,14,15,17};

    public static void main(String[] args) {
        GetAllSubsetByStack get = new GetAllSubsetByStack();
        get.populateSubset(DATA, 0, DATA.length);
    }
}

Güzel bir yaklaşım, ancak sonuçların bir üçlüye sınırlandırıldığı noktayı alamadım. Örneğin girdiyi düşünün: [1,11,3,4,5,6,7,8, 2] ve toplam 12, çözümünüzden [1, 11] [4,8] [1,4, 5,2] vb.
Anupam Saini

0

Problem 2-toplam problemi küçük değişikliklerle genişleterek O (n ^ 2) 'de çözülebilir. A vektör içeren elementler ve B gerekli toplamdır.

int Çözüm :: threeSumClosest (vektör & A, int B) {

sort(A.begin(),A.end());

int k=0,i,j,closest,val;int diff=INT_MAX;

while(k<A.size()-2)
{
    i=k+1;
    j=A.size()-1;

    while(i<j)
    {
        val=A[i]+A[j]+A[k];
        if(val==B) return B;
        if(abs(B-val)<diff)
        {
            diff=abs(B-val);
            closest=val;
        }
        if(B>val)
        ++i;
        if(B<val) 
        --j;
    }
    ++k;

}
return closest;

0

İşte Python3 kodu

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        result = set()
        nums.sort()
        L = len(nums)     
        for i in range(L):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            for j in range(i+1,L):
                if j > i + 1 and nums[j] == nums[j-1]:
                    continue  
                l = j+1
                r = L -1
                while l <= r:
                    sum = nums[i] + nums[j] + nums[l]
                    result.add(sum)
                    l = l + 1
                    while l<=r and nums[l] == nums[l-1]:
                        l = l + 1
        result = list(result)
        min = result[0]
        for i in range(1,len(result)):
            if abs(target - result[i]) < abs(target - min):
                min = result[i]
        return min

-1

Erken kontrol ve başarısız olan başka bir çözüm:

public boolean solution(int[] input) {
        int length = input.length;

        if (length < 3) {
            return false;
        }

        // x + y + z = 0  => -z = x + y
        final Set<Integer> z = new HashSet<>(length);
        int zeroCounter = 0, sum; // if they're more than 3 zeros we're done

        for (int element : input) {
            if (element < 0) {
                z.add(element);
            }

            if (element == 0) {
                ++zeroCounter;
                if (zeroCounter >= 3) {
                    return true;
                }
            }
        }

        if (z.isEmpty() || z.size() == length || (z.size() + zeroCounter == length)) {
            return false;
        } else {
            for (int x = 0; x < length; ++x) {
                for (int y = x + 1; y < length; ++y) {
                    sum = input[x] + input[y]; // will use it as inverse addition
                    if (sum < 0) {
                        continue;
                    }
                    if (z.contains(sum * -1)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

Buraya bazı birim testleri ekledim: GivenArrayReturnTrueIfThreeElementsSumZeroTest .

Küme çok fazla alan kullanıyorsa, O (n / w) alanı kullanacak bir java.util.BitSet'i kolayca kullanabilirim .


-1

Bu üç unsuru almak için program. Ben sadece dizi / liste ilk sıraladık ve onları minClosenessher üçlüye göre güncelledi .

public int[] threeSumClosest(ArrayList<Integer> A, int B) {
    Collections.sort(A);
    int ansSum = 0;
    int ans[] = new int[3];
    int minCloseness = Integer.MAX_VALUE;
    for (int i = 0; i < A.size()-2; i++){
        int j = i+1;
        int k = A.size()-1;
        while (j < k){
            int sum = A.get(i) + A.get(j) + A.get(k);
            if (sum < B){
                j++;
            }else{
                k--;
            }
            if (minCloseness >  Math.abs(sum - B)){
                minCloseness = Math.abs(sum - B);
                ans[0] = A.get(i); ans[1] = A.get(j); ans[2] = A.get(k);
            }
        }
    }
    return ans;
}

-2

Bunu n ^ 3'te yaptım, sahte kodum aşağıda;

// Tamsayı anahtarı ve değeri ArrayList olarak içeren bir hashMap oluşturun // for döngüsü kullanarak listede yineleme yapın, listedeki her değer bir sonraki değerden başlayarak tekrar yinelenir;

for (int i=0; i<=arr.length-1 ; i++){
    for (int j=i+1; j<=arr.length-1;j++){

// arr [i] ve arr [j] toplamı istenen toplamdan azsa, üçüncü bir rakam bulma potansiyeli vardır, bu yüzden döngü için başka bir tane yapın

      if (arr[i]+arr[j] < sum){
        for (int k= j+1; k<=arr.length-1;k++)

// bu durumda şimdi üçüncü değeri arıyoruz; arr [i] ve arr [j] ve arr [k] toplamı istenen toplam ise, arr [i] anahtarını yapıp daha sonra arr [j] ve arr [k] ekleyerek bunları HashMap'e ekleyin bu anahtarın değerindeki ArrayList

          if (arr[i]+arr[j]+arr[k] ==  sum){              
              map.put(arr[i],new ArrayList<Integer>());
              map.get(arr[i]).add(arr[j]);
              map.get(arr[i]).add(arr[k]);}

bundan sonra, istenen toplamı toplayan üç değeri temsil eden tüm girişleri içeren bir sözlüğe sahipsiniz. Tüm bu girdileri HashMap işlevlerini kullanarak ayıklayın. Bu mükemmel çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.