道听途说的技术面:找出正整数序列中连续几个数和为Num的区间

来源:互联网 发布:java重定向到百度 编辑:程序博客网 时间:2024/05/16 08:53

题:有一个正整数区间,找出符合和为num的连续区间,不存在则返回-1


思路:用一个sum存储连续区间和,一个下标存储区间起始位置,一个下标存储区间结束位置。找不到返回-1即可。


代码:

#include <iostream>using namespace std;// if find i and j, return i<<32 & j// else return -1void 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      elseright++;    }  }  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:-10:1-1:-1-1:-11:41:3-1:-1


原创粉丝点击