热门访谈问题:
给定一个正整数数组和一个目标整数,找出是否存在一个与目标相加的连续子数组。
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。
答案 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 == j
,acc
为0
时,正目标会保证if (acc < target)
下的分支被击中。
答案 1 :(得分:1)
刚写完并经过全面测试。两种方法,hasConsec(其中大部分逻辑是)和sumArr(对数组中的值求和的辅助方法)。 hasConsec并使用2个索引(first和last)来创建子数组。辅助方法用于对创建的子数组求和,然后hasConsec检查它是否与目标匹配,是否大于目标,或者是否小于目标。如果匹配,则返回true;如果总和小于目标,则最后一个索引递增;如果它大于目标,则第一个索引递增。重复,直到第一个索引等于数组的长度。如果发生这种情况,则没有与目标相加的子阵列。返回false;
[3,6,7]