![](/img/trans.png)
[英]Use of queues in Java for an array of int, find two numbers that add up to specific sum n
[英]find if 3 numbers in an array add up to a sum
我寫了一種確定數組中是否存在總和的方法。 因此,規則是數組中必須存在3個數字,以便將它們加在一起等於給定的總和。 因此,在數組{1,2,3,14,12}中,如果我正在尋找6的總和,那么2 + 3 + 1就是給我6的數字。通過在線研究,可以用一個集合來完成我有以下功能,但即時通訊很難理解邏輯:
public void existsSum(int[] numbers,int sum){
Set<Integer> set = new HashSet();
for(int i=0;i<numbers.length;i++){
int s1=sum - numbers[i];
for(int j=0;j<numbers.length;j++){
int s2=s1-numbers[j];
if(set.contains(s2)) {
System.out.format("sum of %d + %d + %d gives %d \n", numbers[i], numbers[j],s2, sum);
assert(numbers[i]+numbers[j]+s2==10);
}
}
set.add(numbers[i]);
}
}
我不明白s1和s2的意義是什么? 有人可以向我解釋邏輯。 該方法本身可以正常工作,如果我使用以下方法運行它,將產生正確的結果:
int[] integers = {1,2,3,4,5,6,7,8,9};
existsSum(integers,10);
sum of 2 + 7 + 1 gives 10
sum of 3 + 5 + 2 gives 10
sum of 3 + 6 + 1 gives 10
sum of 4 + 3 + 3 gives 10
sum of 4 + 4 + 2 gives 10
sum of 4 + 5 + 1 gives 10
sum of 5 + 1 + 4 gives 10
sum of 5 + 2 + 3 gives 10
sum of 5 + 3 + 2 gives 10
sum of 5 + 4 + 1 gives 10
sum of 6 + 1 + 3 gives 10
sum of 6 + 2 + 2 gives 10
sum of 6 + 3 + 1 gives 10
sum of 7 + 1 + 2 gives 10
sum of 7 + 2 + 1 gives 10
sum of 8 + 1 + 1 gives 10
該函數只是試圖在集合中找到數字s2,其中s2 = sum-first_number-second_number。 這兩個循環可幫助您遍歷列表中的所有數字,如first_number和last_number。
最后在集合中搜索s2會告訴您s2 + first_number + last_number等於和。
您的代碼無效,因為i
和j
可能指向相同的數字。
此外, assert
將總和硬編碼為10
。
無論如何,沒有設置的主要邏輯是3個嵌套循環:
for (int i = 0; i < numbers.length; i++)
for (int j = i + 1; j < numbers.length; j++)
for (int k = j + 1; k < numbers.length; k++)
if (numbers[i] + numbers[j] + numbers[k] == sum)
System.out.println("sum of %d + %d + %d gives %d\n",
numbers[i], numbers[j], numbers[k], sum);
為了提高性能,可以通過將第三個數字計算為num3 = sum - num1 - num2
來優化最內層的循環,然后查看它是否在數字列表中。
為了防止多次使用相同的號碼,第三次檢查的邏輯相反,以檢查來自循環1的當前號碼之前的所有號碼,並在迭代第一個列表時構建一組號碼。
偽代碼:
set = new set()
for (int i = 0; i < numbers.length; i++)
for (int j = i + 1; j < numbers.length; j++) {
num3 = sum - numbers[i] - numbers[j]
if (num3 in set)
print("sum of %d + %d + %d gives %d\n",
num3, numbers[i], numbers[j], sum);
}
add numbers[i] to set
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.