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

5 篇文章 0 订阅
2 篇文章 0 订阅

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值