题目描述
利用连续数据存在的对称性来快速定位到的n个满足条件的连续数字。
/*
n:次数
if(n%2) mid = sum/n 则以mid为中间数字且满足起始数字大于0情况下,那就一定会存在n个连续的数字满足条件
满足条件集合[mid - n/2,mid + n/2]
if(n%2 == 0) if(sum%n == 0)则一定不存在n个连续的数字满足条件。
当sum%n!=0 时则可能存在这样的连续数字满足条件
mid = sum/n;
满足条件集合[mid - (n-1)/2,mid + (n-1)/2 + 1]
仅当(n-1)/2+1 == sum%n 满足时,才存在这样的集合
这样的求取方式是利用数字连续对称的特性,以第i个数为中心,(i-1)+(i+1)=2i (i-2)+(i+2)=2i
*/
时间复杂度 O(n)? 时间复杂度不太会算的亚子
class Solution {
public:
vector[HTML_REMOVED] > findContinuousSequence(int sum) {
vector[HTML_REMOVED] > result;
if(sum == 0) return result;
vector[HTML_REMOVED] temp;
int i = 2;
while(i<=(sum+1)/2)
{
temp.clear();
if(i%2) //数字个数为奇数时
{
if(sum%i == 0)//当可以整除时才能满足条件
{
int mid = sum/i;
int start = mid -i/2;
if(start>0)
{
for(int j = mid -i/2;j<=mid+i/2;j++)
{
temp.push_back(j);
}
result.push_back(temp);
}
}
}
else
{
if(sum%i)//当不能整除时,才能满足条件
{
int mid = sum/i;
int yushu = sum%i;
int start =mid-(i-1)/2;
if(start>0)
{
if(mid+(i-1)/2+1 == mid+sum%i) // 多出来的那个数与商的差值刚好为余数,则满足条件
{
for(int j = start;j<=mid+(i-1)/2+1;j++)
{
temp.push_back(j);
}
result.push_back(temp);
}
}
}
}
i++;
}
return vector<vector<int> >(result.rbegin(),result.rend());
}
};