题:有一个正整数区间,找出符合和为num的连续区间,不存在则返回-1
思路:用一个sum存储连续区间和,一个下标存储区间起始位置,一个下标存储区间结束位置。找不到返回-1即可。
代码:
#include <iostream>
using namespace std;
// if find i and j, return i<<32 & j
// else return -1
void findSubArray(int *arr, int size, int num, int *result){
int sum=0;
int left=0;
int right=0;
sum=arr[left];
while(sum!=num&&right<size&&left<size){
if(sum>num){
sum-=arr[left++];
}else{
// for the 1st time arr[left]<num
if(right<left) right=left;
// for out of range.
if(right<size-1)
sum+=arr[++right];
// stop the loop
else
right++;
}
}
if(sum!=num){
result[0]=-1;
result[1]=-1;
}else{
result[0]=left;
result[1]=right;
}
}
int main(){
int arr[]={10, 8, 0, 3, 6, 2};
int re[2];
findSubArray(arr, 1, 10, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 1, 7, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 1, 11, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 2, 18, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 2, 17, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 2, 20, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 6, 9, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 6, 11, re);
cout << re[0] << ":" << re[1] << endl;
findSubArray(arr, 6, 12, re);
cout << re[0] << ":" << re[1] << endl;
}
输出:
0:0
-1:-1
-1:-1
0:1
-1:-1
-1:-1
1:4
1:3
-1:-1