オファー] [すべての正の数の安全性や連続出力を証明し、シーケンスSは、連続したシーケンスsが正の数です。開始昇順に従ってシーケンス番号との間の昇順で昇順

タイトルリピート

暁明は、彼が計算するのに必要と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;
		}
	};
公開された57元の記事 ウォン称賛28 ビュー4115

おすすめ

転載: blog.csdn.net/weixin_41747893/article/details/104706402