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

题:有一个正整数区间,找出符合和为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
点赞