计算R中的4或n总和

时间:2019-06-14 13:40:28

标签: r

我正在尝试在R的数据科学家访谈中练习LeetCode问题,而我遇到的问题之一是foursum。为了解决这个问题,我试图生成所有四个不同的组合,并使用apply函数来计算总和。是否有更好的方法可以在R中对其进行优化而不使用combn

GetFourSumCombinations <- function(TestVector,Target){
  CombinationPairs = combn(TestVector, 4)  ## Get all the combinations
  SumOfAllCombinations = apply(CombinationPairs, 2, sum)
  TargetElements = which(SumOfAllCombinations == Target)
  return(CombinationPairs[,TargetElements])
}
## OutPut:
TestVector = c(1, 0, -1, 0, -2, 2), Target = 0
GetFourSumCombinations(TestVector,0)
     [,1] [,2] [,3]
[1,]    1    1    0
[2,]    0   -1    0
[3,]   -1   -2   -2
[4,]    0    2    2

2 个答案:

答案 0 :(得分:3)

这是一个简短的版本

GetFourSumCombinations <- function(TestVector,Target){
   vals <- combn(TestVector, 4)
   vals[, colSums(vals) == Target]
}

GetFourSumCombinations(TestVector, Target)

#     [,1] [,2] [,3]
#[1,]    1    1    0
#[2,]    0   -1    0
#[3,]   -1   -2   -2
#[4,]    0    2    2

数据

TestVector <- c(1, 0, -1, 0, -2, 2)
Target = 0

答案 1 :(得分:2)

运行combn,将其转换为data.frame,然后Filter移出所需的列。它只有一行,没有下标。

target4 <- function(x, target = 0) {
  Filter(function(x) sum(x) == target, as.data.frame(combn(x, 4)))
}

TestVector <- c(1, 0, -1, 0, -2, 2)
target4(TestVector)

给予:

  V1 V9 V14
1  1  1   0
2  0 -1   0
3 -1 -2  -2
4  0  2   2

2)更长,但不使用combn

target4a <- function(x, target = 0) {
  g <- do.call("expand.grid", rep(list(seq_along(x)), 4))
  ok <- apply(g, 1, function(x) all(diff(x) > 0))
  g2 <- apply(g[ok, ], 1, function(ix) x[ix])
  g2[, colSums(g2) == target]
}

target4a(TestVector)

3),或者将(2)分解为自定义组合和(1)。

combn4 <- function(x) {
  g <- do.call("expand.grid", rep(list(seq_along(x)), 4))
  ok <- apply(g, 1, function(x) all(diff(x) > 0))
  apply(g[ok, ], 1, function(ix) x[ix])
}

target4b <- function(x, target = 0) {
  Filter(function(x) sum(x) == target, as.data.frame(combn4(x)))
}

target4b(TestVector)