其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是
O(n2)啰。但是这题目肯定不会这么简单,否则就是小学生的水平了嘛。
其实我刚到这题的时候想到的是用二叉查找的方法进行。但是可能有点困难。
书上提供的方法固然是很巧妙的。
我们要抓住题目中数组的特点,是排好序的。
我们先定义两个指针。一个指头,一个指尾。
我们来计算start+end=16>15。于是知大了,咋办?
我们将end往后移一位。也就是如下了:
些时 1+11=12<15..咋办?
肯定是将start往后移一位啊。
2+11=13<15还是小了
正好嘛。4+11=15..于是,找到了这个值。
void findTwoDataSumed(int *arr,int Length,int v_sum,int *num1,int *num2){
if(arr==NULL||Length==0){
return;
}
int first=0;
int last=Length-1;
while(first<last){
if(arr[first]+arr[last]>v_sum){
last--;
}
if(arr[first]+arr[last]<v_sum){
first++;
}
if(arr[first]+arr[last]==v_sum){
*num1=arr[first];
*num2=arr[last];
return;
}
}
}
这个题目肯定得用到上面的思想了。
其实我第一眼看到这个题目的时候思路是:
输入15吧。 15/1=15 。要两个数才行。
15/2=8.。那么8是这两个数的平均大小(准确地说是7.5)。于是知我们找到8和7。因为它们不仅连续,而且平均数是7.5.OK
15/3=5. 要求平均数是5哦。肯定是3、4、5不行,5、6、7也不行。4、5、6正好嘛。
15/4=3.75。好复杂的数字。于是我们想。四个数的平均数是3.75. 没有
15/5=3. 正好是1-5
后面的数其本不可能了的,。
你想。15/6=平均数太小了。不存在这样的连续数字。15/7.就更不可能了。
而这个算法的思路是:
void findContinueSequenceSum(int v_sum){
if(v_sum<3){
return;
}
int start=1;
int end=2;
int curSum=start+end;
int mid=(v_sum+1)/2;
while(start<mid){
if(curSum==v_sum){
printSeqNum(start,end);
}
if(curSum>v_sum&&start<mid){
curSum-=start;
start++;
if(curSum==v_sum){
printSeqNum(start,end);
}
}
if(curSum<=v_sum&&start<mid){
end++;
curSum+=end;
}
}
}
void printSeqNum(int start,int end){
for(int i=start; i<end; i++){
std::cout<<start<<",";
}
std::cout<<end;
}