我想target通過添加整數直到達到它在陣列中找到一個總和,然后通過使用流回傳加到目標的索引。
例如,如果提供的陣列 is{1, 2, 3, 4}和targetis 4,則該方法應列印出由 index 組成的 int 陣列{0,2},但不會。
代碼如下:
public static int[] twoSum(int[] numbers, int target) {
IntStream.of(0, numbers.length - 1).boxed()
.flatMap(i -> IntStream.range(i , numbers.length - 1).boxed()
.filter(j -> numbers[j] numbers[i] == target)
.flatMap(j -> Stream.of(new int[]{i , j}, new int[] {j,i})))
.forEach(num -> System.out.println(Arrays.toString(num)));
return numbers;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(twoSum(new int[]{1,2,5,1}, 4)));
}
uj5u.com熱心網友回復:
首先,讓我們描述解決問題的可能方法:
- 蠻力方法:使用嵌套回圈或使用嵌套流迭代源陣列(提醒:流只是迭代的一種方法)并檢查每個元素是否在陣列中存在對應的 for,以便它們一起構成給定總和。時間復雜度為O(n^2)。
- 所謂的雙指標方法:對給定的陣列進行排序,定義兩個變數,它們最初指向第一個和最后一個索引,然后移動指標。該演算法只能使用命令式風格來實作。時間復雜度是O(n log n)(因為需要排序),這是更好的嵌套回圈/流。
- 創建一個
Map將結果的所有元素對存盤到目標總和中。該演算法在線性時間O(n)中運行。只需要對源陣列進行兩次迭代。
下面的解決方案提供了一種基于流的實作,該方法利用Map.
作為第一步,我們需要生成一個映射,該映射將關聯一個需要添加到特定元素的值,以獲得target和(a key)和陣列元素的索引(a value)。
然后在給定陣列的索引上創建一個流,過濾掉與映射中的鍵匹配的第一個元素,并基于它構造一個二值陣列。
如果未找到結果 - 回傳一個空陣列。
public static int[] twoSum(int[] numbers, int target) {
Map<Integer, Integer> sumMap = getSumMap(numbers, target);
return IntStream.range(0, numbers.length)
.filter(i -> sumMap.containsKey(numbers[i]))
.mapToObj(i -> new int[]{i, sumMap.get(numbers[i])})
.findFirst()
.orElse(new int[0]);
}
public static Map<Integer, Integer> getSumMap(int[] numbers, int target) {
rreturn IntStream.range(0, numbers.length)
.boxed()
.collect(Collectors.toMap(
i -> target - numbers[i], // a key - dif between target sum and a current element
Function.identity(), // a value - index of the current element
(left, right) -> left)); // resolving duplicates
}
main()- 演示
public static void main(String[] args) {
System.out.println(Arrays.toString(twoSum(new int[]{1, 4, 3, 0, 4, 1}, 4)));
}
輸出
[0, 2] // indices of the first pair of elements (1, 3) that can produce the sum of `4`
uj5u.com熱心網友回復:
不確定,但是如果您完全使用此代碼,可能是因為您在 foreach 之后出現的拼寫錯誤。您將輸入啟動為nu,但將其列印為num。
.forEach(num -> System.out.println(Arrays.toString(num)));
也許用你所擁有的替換它會解決問題。
編輯
關于對評論的更多澄清,人們意識到這是給定值的問題,與 Java 流 API 無關。
uj5u.com熱心網友回復:
IntStreams您可以嵌套兩個以產生所需的結果(據我了解),而不是使用 for 回圈。這將回傳總和為目標值的所有對。這不包括添加到自身等于目標的陣列元素。因此,對于 , 的目標4,[2, 2]結果不包括在內
int[] arr1 = { 1, 2, 3, 4, 5, -2, -1, -3, -4, -5 };
int[][] array = twoSum(arr1, 4);
for (int[] a : array) {
System.out.println(Arrays.toString(a));
}
印刷
[1, 3]
[5, -1]
- 首先,流式傳輸從 0 到比陣列大小小 1 的整數范圍。
- 然后用于
boxed將 int 轉換為物件。 - 然后你
flatMap(將嵌套的流組合成一個)另一個IntStream從比前一個流多一個開始,但陣列的全長。 - 仍在
flatMap構造中,并使用 的值IntStreams作為所提供陣列的索引,過濾掉不與目標相加的值,并創建一個由兩個加起來的數字組成的陣列(這也可以替換為如果需要,陣列的索引)。 - 然后回傳這個陣列陣列作為結果。
public static int[][] twoSum(int[] numbers, int target) {
return IntStream.range(0, numbers.length - 1)
.boxed()
.flatMap(i -> IntStream.range(i 1, numbers.length)
.filter(k -> numbers[i] numbers[k] == target)
.mapToObj(k -> new int[] { numbers[i],numbers[k] }))
.toArray(int[][]::new);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471200.html
上一篇:如何找到與特定頂點相關的邊串列
