ソードフィンガーオファーインタビュー質問57-2:合計はsの連続的な正のシーケンスです(答えは良い考えです。2次元配列の実現と操作です)

この質問について考えた後、数が連続する正の整数のシーケンスの合計で表すことができる場合、正の整数のシーケンス内の要素の数がこの数に関連していることがわかりました。

要素の数が偶数の場合、この数をこの偶数で割ると、得られる値は整数+ 0.5の形式になり、この整数+0.5を次のように持つ連続した正の整数シーケンスで表すことができます。平均値。

奇数の場合、この数をこの奇数で割ると、得られる値は整数になり、この整数を平均値とする一連の正の整数で表すことができます。

次に、連続する負の数のシーケンスを削除します。それだけです。

アイデアとコードはすべて自分で作成されていますが、中央に2次元配列の実装がいくつかあり、他の人が使用する方法は次のとおりです。

List<int[]> res = new ArrayList<int[]>();


return res.toArray(new int[res.size()][]);

これらの2つの文を覚えておいてください。

 

 

私のコード

    public int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<int[]>();
        
        for(int count = target - 1;count>1;count--){
            if(count%2 == 1){
                if(target%count == 0){
                    
                    if(target/count - count/2 >0 && target/count + count/2 < target){
                        int[] res_part = new int[count];
                        int count_part = target/count - count/2;
                        for(int count_inner = 0;count_inner<count;count_inner++){
                            res_part[count_inner] = count_part + count_inner;
                        }
                        res.add(res_part);

                    }
                    
                }
            }else if(count%2 == 0){
                if(target%count == count/2){
                    if(target/count + 1 - count/2 >0 && target/count + count/2 < target){
                        int[] res_part = new int[count];
                        int count_part = target/count + 1 - count/2;
                        for(int count_inner = 0;count_inner<count;count_inner++){
                            res_part[count_inner] = count_part + count_inner;
                        }
                        res.add(res_part);
                    }
                }
            }
        }
        return res.toArray(new int[res.size()][]);
    }

 

答えの考え方は異なります.2つのポインターを設定することです.1つは1を表す小さいもので、もう1つは2を表す大きいものです。2つの合計がターゲットよりも小さい場合、大きいものは右にシフトされます、そしてそれが目標よりも大きい場合、小さいものは左にシフトされます。すべてを取得するには、私の方法を比較してください。私の時間はo(n ^ 2)、答えはo(n)、答えはより良いです。

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/115028112