是否存在与目标相加的子阵列?

时间:2015-10-06 02:33:39

标签: arrays algorithm

热门访谈问题:

给定一个正整数数组和一个目标整数,找出是否存在一个与目标相加的连续子数组。

E.g。

数组= angular.directive('body',function() { return { restrict: 'E', transclude: true, link: function(scope,el,attr,ctrl,transcludeFn) { transcludeFn(function(cloned){ cloned.find('input[type="password"]').attr('newDirective',true); el.append(cloned); }); } } } 目标= [1,3,6,7,8,10] 总和为16的子数组为16,因此返回true。

2 个答案:

答案 0 :(得分:7)

这是线性时间(C ++代码)。

bool Test(const int* arr, int size, int target) {
  if (target < 0) return false;
  int acc = 0;
  int i = 0, j = 0;
  while (acc != target) {
    if (acc < target) {
      if (j == size) break;
      acc += arr[j++];
    }
    else {
      acc -= arr[i++];
    }
  }
  return acc == target;
}

请注意,必须预先检查负目标值,以保证i <= j的循环不变量。具体来说,当i == jacc0时,正目标会保证if (acc < target)下的分支被击中。

答案 1 :(得分:1)

刚写完并经过全面测试。两种方法,hasConsec(其中大部分逻辑是)和sumArr(对数组中的值求和的辅助方法)。 hasConsec并使用2个索引(first和last)来创建子数组。辅助方法用于对创建的子数组求和,然后hasConsec检查它是否与目标匹配,是否大于目标,或者是否小于目标。如果匹配,则返回true;如果总和小于目标,则最后一个索引递增;如果它大于目标,则第一个索引递增。重复,直到第一个索引等于数组的长度。如果发生这种情况,则没有与目标相加的子阵列。返回false;

[3,6,7]