タイトルリピート
暁明は、彼が計算するのに必要と9〜16は、彼はすぐに正しい答えは100で書いた、数学の宿題をやっていた、数学、1日の非常に好きです。しかし、彼はこれで満足していなかった、彼は連続正数列の多くの種類が100(少なくとも二つの数字を含む)であるか疑問に思いました。18,19,20,21,22:長い前に、彼は連続した正の数と100のシーケンスの別のセットを得ました。今、あなたの質問は、あなたもすぐにすべての正と連続したシーケンスS?幸運を識別することができます!
出力説明:
すべての正の出力と連続数列S. 開始昇順に従ってシーケンス番号との間の昇順で昇順
コードで私の考え:
おそらく、ほとんどのオリジナルのアイデアは、私は安全性を証明し、非常に異なる複雑さ、S Iで高い複雑さを感じるように提供する上でのスペースの最適化のアイデアの時間複雑後もサイクルとres.push_backにアップ追加しませんでした。コメントを与えることを歓迎。
アイデア:
まず、我々は確かにこれ以上50以下=次いで連続配列100/2、そのような数が100であることを理解していない99と、デジタルシーケンスは50 = 99/2 + 1を超えないように連続的にこのような追加します。ここでは、奇数と偶数の順序を区別しませんし、両方のことを連続した正のシーケンスSの数が一定の順序を想定し、これ以上のS / 2 + 1以上であるとTMPあり;
TMP> ++とき、私の合計;
TMP <和とするときJ ++
例えば、5 = S
[2. 1. 4. 3. 5]
5連続配列の最大和に等しいがそれ以上= 3 5/2 + 1以下である、ダウンサイクルが始まる
5中、RESが空になると、場合TMP ==; TMP <TMP場合時間5、RESは、I及びJを一backう>場合5、result.push_back(RES)、およびブレークを空にし、解像度のプロセス。
I = 1
TMP = I = 1 <5那么TMP = TMP + J = 1 + 2 = 3 <5那么TMP = TMP + J = 1 + 2 + 3 = 6> 5ブレーク。
2 = I
TMP = 2 <5次いでTMP = 2 + 3 = 5 result.push_back。 (RES)、 およびブレークを空にし、解像度のプロセス。
3 = I
TMP =私は= 3が、J = I + 1 = 4> (+ 1 5/2) 、ループ終了、戻り結果。
コード
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int len = sum / 2 +1;
vector<vector<int> > result;
vector<int>res;
if (sum <3) {
return result;
}
else{
for (int i = 1; i <= len; i++) {
int tmp = i;
res.push_back(i);
for (int j = i+1; j <= len; j++) {
if(tmp<sum){
tmp += j;
res.push_back(j);
}
if (tmp > sum) {
res.clear();
break;
}
if (tmp ==sum){
result.push_back(res);
res.clear();
break;
}
}
}
}
return result;
}
};
安全性を証明するためのアイデアを提供します
ダブルポインタの問題
合計が少ない合計よりもときに、大きな++ポインタ続行
や小さなポインタを++
リンクします。https:?//www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55ebe F =議論
出典:牛オフネットワーク
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > result;
vector<int> res;
int phigh = 2, plow = 1;
while (phigh > plow) {
int cur = (phigh + plow) * (phigh - plow + 1) / 2;//等差数列求和
if (cur < sum)
phigh++;
if (cur == sum) {
for (int i = plow; i <= phigh; i++)
res.push_back(i);
result.push_back(res);
res.clear();
plow++;
}
if (cur > sum)
plow++;
}
return result;
}
};