Cari Semua Pasangan Nombor dalam Array yang Menambah Hingga Jumlah yang Diberi di Jawa

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami akan menunjukkan cara menerapkan algoritma untuk mencari semua pasangan nombor dalam array yang jumlahnya sama dengan nombor yang diberikan. Kami akan menumpukan pada dua pendekatan untuk mengatasi masalah tersebut .

Dalam pendekatan pertama, kita akan menemui semua pasangan seperti itu tanpa mengira keunikannya. Pada detik, kita hanya akan menjumpai kombinasi nombor unik, membuang pasangan berlebihan.

Bagi setiap pendekatan, kami akan membentangkan dua perlaksanaan - pelaksanaan tradisional menggunakan untuk gelung, dan kedua menggunakan API Java 8 Stream.

2. Kembalikan Semua Pasangan Sepadan

Kami akan melakukan iterasi melalui sebilangan bilangan bulat, mencari semua pasangan ( i dan j ) yang berjumlah hingga nombor yang diberi ( jumlah ) menggunakan pendekatan brute-force, nested-loop. Algoritma ini akan mempunyai kerumitan runtime O (n2) .

Untuk demonstrasi kami, kami akan mencari semua pasangan nombor yang jumlahnya sama dengan 6 , menggunakan susunan input berikut :

int[] input = { 2, 4, 3, 3 }; 

Dalam pendekatan ini, algoritma kami harus mengembalikan:

{2,4}, {4,2}, {3,3}, {3,3}

Dalam setiap algoritma, apabila kita menemukan pasangan nombor yang berjumlah hingga jumlah sasaran, kita akan mengumpulkan pasangan menggunakan kaedah utiliti, addPairs (i, j) .

Cara pertama yang mungkin kita fikirkan untuk melaksanakan penyelesaiannya adalah dengan menggunakan kaedah tradisional untuk gelung:

for (int i = 0; i < input.length; i++) { for (int j = 0; j < input.length; j++) { if (j != i && (input[i] + input[j]) == sum) { addPairs(input[i], sum-input[i])); } } }

Ini mungkin sedikit dasar, jadi mari kita tulis implementasi menggunakan Java 8 Stream API .

Di sini, kami menggunakan kaedah IntStream.range untuk menghasilkan aliran nombor yang berurutan. Kemudian, kami menapisnya untuk keadaan kami: nombor 1 + nombor 2 = jumlah :

IntStream.range(0, input.length) .forEach(i -> IntStream.range(0, input.length) .filter(j -> i != j && input[i] + input[j] == sum) .forEach(j -> addPairs(input[i], input[j])) ); 

3. Kembalikan Semua Pasangan Pencocokan Unik

Untuk contoh ini, kita harus mengembangkan algoritma yang lebih pintar yang hanya mengembalikan gabungan nombor yang unik, dengan menghilangkan pasangan berlebihan .

Untuk mencapainya, kami akan menambahkan setiap elemen ke peta hash (tanpa menyusun), memeriksa terlebih dahulu apakah pasangan itu sudah ditunjukkan. Sekiranya tidak, kami akan mengambil dan menandainya seperti yang ditunjukkan (tetapkan medan nilai sebagai nol ).

Oleh itu, menggunakan array input yang sama seperti sebelumnya, dan jumlah sasaran 6 , algoritma kami hanya akan mengembalikan kombinasi nombor yang berbeza:

{2,4}, {3,3}

Sekiranya kita menggunakan kaedah tradisional untuk gelung, kita akan mempunyai:

Map pairs = new HashMap(); for (int i : input) { if (pairs.containsKey(i)) { if (pairs.get(i) != null) { addPairs(i, sum-i); } pairs.put(sum - i, null); } else if (!pairs.containsValue(i)) { pairs.put(sum-i, i); } }

Perhatikan bahawa pelaksanaan ini bertambah baik pada kerumitan sebelumnya, kerana kita hanya menggunakan satu untuk gelung, jadi kita akan mempunyai O (n) .

Sekarang mari kita selesaikan masalah menggunakan Java 8 dan Stream API:

Map pairs = new HashMap(); IntStream.range(0, input.length).forEach(i -> { if (pairs.containsKey(input[i])) { if (pairs.get(input[i]) != null) { addPairs(input[i], sum - input[i]); } pairs.put(sum - input[i], null); } else if (!pairs.containsValue(input[i])) { pairs.put(sum - input[i], input[i]); } });

4. Kesimpulan

Dalam artikel ini, kami menerangkan beberapa cara yang berbeza untuk mencari semua pasangan yang menjumlahkan bilangan tertentu di Java. Kami melihat dua penyelesaian yang berbeza, masing-masing menggunakan dua kaedah inti Java.

Seperti biasa, semua contoh kod yang ditunjukkan dalam artikel ini boleh didapati di GitHub - ini adalah projek Maven, jadi mudah untuk menyusun dan menjalankannya.