You are given two 2D integer arrays, items1
and items2
, representing two sets of items. Each array items
has the following properties:
items[i] = [valuei, weighti]
where valuei
represents the value and weighti
represents the weight of the ith
item.items
is unique.Return a 2D integer array ret
where ret[i] = [valuei, weighti]
, with weighti
being the sum of weights of all items with value valuei
.
Note: ret
should be returned in ascending order by value.
Example 1:
Input: items1 = [[1,1],[4,5],[3,8]], items2 = [[3,1],[1,5]]
Output: [[1,6],[3,9],[4,5]]
Explanation:
The item with value = 1 occurs in items1 with weight = 1 and in items2 with weight = 5, total weight = 1 + 5 = 6.
The item with value = 3 occurs in items1 with weight = 8 and in items2 with weight = 1, total weight = 8 + 1 = 9.
The item with value = 4 occurs in items1 with weight = 5, total weight = 5.
Therefore, we return [[1,6],[3,9],[4,5]].
Example 2:
Input: items1 = [[1,1],[3,2],[2,3]], items2 = [[2,1],[3,2],[1,3]] Output: [[1,4],[2,4],[3,4]] Explanation: The item with value = 1 occurs in items1 with weight = 1 and in items2 with weight = 3, total weight = 1 + 3 = 4. The item with value = 2 occurs in items1 with weight = 3 and in items2 with weight = 1, total weight = 3 + 1 = 4. The item with value = 3 occurs in items1 with weight = 2 and in items2 with weight = 2, total weight = 2 + 2 = 4. Therefore, we return [[1,4],[2,4],[3,4]].
Example 3:
Input: items1 = [[1,3],[2,2]], items2 = [[7,1],[2,2],[1,4]] Output: [[1,7],[2,4],[7,1]] Explanation: The item with value = 1 occurs in items1 with weight = 3 and in items2 with weight = 4, total weight = 3 + 4 = 7. The item with value = 2 occurs in items1 with weight = 2 and in items2 with weight = 2, total weight = 2 + 2 = 4. The item with value = 7 occurs in items2 with weight = 1, total weight = 1. Therefore, we return [[1,7],[2,4],[7,1]].
Constraints:
1 <= items1.length, items2.length <= 1000
items1[i].length == items2[i].length == 2
1 <= valuei, weighti <= 1000
valuei
in items1
is unique.valuei
in items2
is unique.program main
use, intrinsic :: iso_fortran_env, only : error_unit, DP => REAL64
implicit none
integer, parameter :: n = 3
integer, dimension(n, 2) :: items1 = reshape([1,1,4,5,3,8],[n,2])
integer, dimension(n, 2) :: items2 = reshape([3,1,1,5],[n,2])
integer, dimension(:, :), allocatable :: ret
allocate(ret(n, 2))
call solve(items1, items2, ret)
write (unit=error_unit, fmt='(*(I0, 1X))') ret
contains
subroutine solve(items1, items2, ret)
implicit none
integer, intent(in) :: items1(:, :)
integer, intent(in) :: items2(:, :)
integer, intent(out) :: ret(:, :)
integer :: i, j, k
integer :: sum_weights
do i = 1, size(items1, 1)
do j = 1, size(items2, 1)
if (items1(i, 1) == items2(j, 1)) then
sum_weights = items1(i, 2) + items2(j, 2)
do k = 1, size(ret, 1)
if (ret(k, 1) == items1(i, 1)) then
ret(k, 2) = sum_weights
exit
end if
end do
end if
end do
end do
! sort ret by value
call sort(ret, 1)
end subroutine solve
end program main
temp.f95:6:49: 6 | integer, dimension(n, 2) :: items2 = reshape([3,1,1,5],[n,2]) | 1 Error: Without padding, there are not enough elements in the intrinsic RESHAPE source at (1) to match the shape temp.f95:11:29: 11 | call solve(items1, items2, ret) | 1 Error: Symbol ‘items2’ at (1) has no IMPLICIT type; did you mean ‘items1’?
module main
implicit none
integer, parameter :: dp = selected_real_kind(15, 307)
integer, intent(in) :: items1(:, :)
integer, intent(in) :: items2(:, :)
integer :: ret(size(items1, 1), 2)
integer :: i, j, k, l, m
integer :: value, weight
! Initialize the ret array with the values and weights of items1
do i = 1, size(items1, 1)
ret(i, 1) = items1(i, 1)
ret(i, 2) = items1(i, 2)
end do
! Sort the ret array in ascending order by value
call sort(ret, 1, size(ret, 1), 2, order='ascending')
! Loop through items2 and add the weights of items with the same value as in items1
do i = 1, size(items2, 1)
value = items2(i, 1)
weight = items2(i, 2)
! Find the index of the first item with the same value as in items2
do j = 1, size(ret, 1)
if (ret(j, 1) == value) exit
end do
! Add the weight of items with the same value as in items2
do k = j, size(ret, 1)
if (ret(k, 1) /= value) exit
ret(k, 2) = ret(k, 2) + weight
end do
end do
! Print the result
do i = 1, size(ret, 1)
write (*, '(i5, x, i5)') ret(i, 1), ret(i, 2)
end do
contains
subroutine sort(array, low, high, dim, order)
implicit none
integer, intent(inout) :: array(:, :)
integer, intent(in) :: low, high, dim
character(len=*), intent(in) :: order
integer :: i, j, temp
if (low < high) then
! Partition the array
i = low - 1
j = high + 1
do
do while (array(low, dim) < array(j, dim))
j = j - 1
end do
do while (array(i, dim) > array(low, dim))
i = i + 1
end do
if (i < j) then
do l = 1, dim - 1
temp = array(i, l)
array(i, l) = array(j, l)
array(j, l) = temp
end do
do l = 1, 2
temp = array(i, l)
array(i, l) = array(j, l)
array(j, l) = temp
end do
i = i + 1
j = j - 1
else
exit
end if
end do
! Recursively sort the partitions
call sort(array, low, j, dim, order)
call sort(array, i, high, dim, order)
end if
end subroutine sort
end module main
program test
use main
implicit none
integer, parameter :: items1(3, 2) = reshape([1, 1, 4, 5, 3, 8], shape(items1))
integer, parameter :: items2(2, 2) = reshape([3, 1, 1, 5], shape(items2))
integer :: ret(size(items1, 1), 2)
call solve(items1, items2, ret)
end program test
temp.f95:9:34: 9 | integer :: ret(size(items1, 1), 2) | 1 Error: Explicit shaped array with nonconstant bounds at (1) temp.f95:15:25: 15 | do i = 1, size(items1, 1) | 1 Error: Unexpected DO statement in MODULE at (1) temp.f95:16:28: 16 | ret(i, 1) = items1(i, 1) | 1 Error: Unexpected assignment statement in MODULE at (1) temp.f95:17:28: 17 | ret(i, 2) = items1(i, 2) | 1 Error: Unexpected assignment statement in MODULE at (1) temp.f95:18:3: 18 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:21:53: 21 | call sort(ret, 1, size(ret, 1), 2, order='ascending') | 1 Error: Unexpected CALL statement in MODULE at (1) temp.f95:24:25: 24 | do i = 1, size(items2, 1) | 1 Error: Unexpected DO statement in MODULE at (1) temp.f95:25:24: 25 | value = items2(i, 1) | 1 Error: Unexpected assignment statement in MODULE at (1) temp.f95:26:25: 26 | weight = items2(i, 2) | 1 Error: Unexpected assignment statement in MODULE at (1) temp.f95:29:26: 29 | do j = 1, size(ret, 1) | 1 Error: Unexpected DO statement in MODULE at (1) temp.f95:30:36: 30 | if (ret(j, 1) == value) exit | 1 Error: EXIT statement at (1) is not within a construct temp.f95:31:7: 31 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:34:26: 34 | do k = j, size(ret, 1) | 1 Error: Unexpected DO statement in MODULE at (1) temp.f95:35:36: 35 | if (ret(k, 1) /= value) exit | 1 Error: EXIT statement at (1) is not within a construct temp.f95:36:38: 36 | ret(k, 2) = ret(k, 2) + weight | 1 Error: Unexpected assignment statement in MODULE at (1) temp.f95:37:7: 37 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:38:3: 38 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:41:22: 41 | do i = 1, size(ret, 1) | 1 Error: Unexpected DO statement in MODULE at (1) temp.f95:42:49: 42 | write (*, '(i5, x, i5)') ret(i, 1), ret(i, 2) | 1 Error: Unexpected WRITE statement in MODULE at (1) temp.f95:43:3: 43 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:7:35: 7 | integer, intent(in) :: items1(:, :) | 1 Error: Symbol at (1) is not a DUMMY variable temp.f95:8:35: 8 | integer, intent(in) :: items2(:, :) | 1 Error: Symbol at (1) is not a DUMMY variable temp.f95:86:40: 86 | call sort(array, low, j, dim, order) | 1 Error: SUBROUTINE ‘sort’ at (1) cannot be called recursively, as it is not RECURSIVE temp.f95:87:41: 87 | call sort(array, i, high, dim, order) | 1 Error: SUBROUTINE ‘sort’ at (1) cannot be called recursively, as it is not RECURSIVE temp.f95:95:5: 95 | use main | 1 Fatal Error: Cannot open module file ‘main.mod’ for reading at (1): No such file or directory compilation terminated.
def sum_weights(items1, items2):
weight_sums = {}
result = []
for value, weight in items1:
weight_sums[value] = weight_sums.get(value, 0) + weight
for value, weight in items2:
weight_sums[value] = weight_sums.get(value, 0) + weight
for value, weight in sorted(weight_sums.items()):
result.append([value, weight])
return result
weightSums
to store the sum of weights for every value
. Initialize an empty list result
for returning the solution.items1
and items2
arrays. For each [value, weight]
pair, add the weight to the weightSums
map for that value. If the value is not present in the map, set its value to be equal to the current weight.weightSums
items (by key/values in ascending order), and append each [value, weight]
to the result
list.result
list.#include <vector>
#include <map>
using namespace std;
vector<vector<int>> sumWeights(vector<vector<int>>& items1, vector<vector<int>>& items2) {
map<int, int> weightSums;
vector<vector<int>> result;
for (const auto& item : items1) {
weightSums[item[0]] += item[1];
}
for (const auto& item : items2) {
weightSums[item[0]] += item[1];
}
for (const auto& entry : weightSums) {
result.push_back({entry.first, entry.second});
}
return result;
}
weightSums
to store the sum of weights for every value
. Initialize an empty list result
for returning the solution.items1
and items2
arrays. For each [value, weight]
pair, add the weight to the weightSums
map for that value. If the value is not present in the map, set its value to be equal to the current weight.weightSums
items (by key/values in ascending order), and append each [value, weight]
to the result
list.result
list.