总和小于K的数组中增加子序列的数量?

时间:2016-08-28 20:47:35

标签: arrays algorithm dynamic-programming

我遇到了一个问题,我必须找出总和小于K的数组中增加子序列的数量。

示例:

让我们说给定的数组是

{5, 12, 7, 9, 10}

不断增加的子序列是:

{5} , {12} , {5, 12} , {7} , {5, 7}
{9} , {5, 9} , {7, 9} , {5, 7, 9}
{10} , {5, 10}, {7, 10} , {5, 7, 10}, {9, 10}
{5, 9, 10} , {7, 9, 10} , {5, 7, 9, 10}

总共有17个不断增加的子序列。

设K的值为16,则总和小于K的递增子序列的数量变为8。

这些子序列是:

{5} , {12} , {7} , {5, 7} , {9} , {5, 9} , {10} , {5, 10}

所以上述问题的答案是8。

我想出了一个使用动态编程的解决方案,它通过了我所有的测试用例。代码如下 -

int arr[] = {5, 12, 7, 9, 10};
int K = 16;
int sum = 0;
ArrayList<ArrayList<Integer>> cumSumList = new ArrayList<ArrayList<Integer>>(arr.length);

for(int i=0; i<arr.length; i++){
  ArrayList<Integer> li = new ArrayList<Integer>();
  li.add(arr[i]);
  cumSumList.add(li);

  if(arr[i] < K)
    sum++;
}

for(int i=1; i<arr.length; i++){
  ArrayList<Integer> li = cumSumList.get(i);
  for(int j=0; j<i; j++){
    if(arr[i] > arr[j]){
      ArrayList<Integer> preLi = cumSumList.get(j);
      for(int idx=0; idx<preLi.size(); idx++){
        int addVal = preLi.get(idx) + arr[i];
        if(addVal < K){
          li.add(addVal);
          sum++;
        }
      }
    }
  }
  cumSumList.set(i, li);
}
System.out.println(sum);

我想知道是否有更好/最佳的解决方案来解决这个问题?如果有人可以为他们的测试用例测试这些代码并且让我知道它是否通过你的测试用例,那就太棒了。

0 个答案:

没有答案