和为S的两个数VS和为S的连续正数序列

it2026-01-04  5

     其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是 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; } 来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/yml435/p/4655470.html

最新回复(0)