考えて私立学校-LeetCode16。3つの数字の最も近い合計

LeetCode16。3つの数値の最も近い合計

こんにちは、皆さん、私はあなたの昔の友達のツカフです。本日は、3番目の合計の問題であるLeetCodeの中難度の問題を見ていきます。この記事を読んだ後、いくつかの利益が得られることを願っています。

トピック:

まず、トピックの説明を見てみましょう。

[外部リンク画像の転送に失敗しました。元のサイトにはアンチリーチリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-J1j4JLzT-1593154112609)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img /20200626110631.png)]

分析

この問題については、最初に簡単なシナリオから分析します。

番号を見つけるだけ

最も単純なシナリオは、最も近い合計を見つけることに他なりません。その場合、必要なのは1つの変数(最高)を維持することだけです。Bestは、現在の最良の値を記録し、アレイ全体がトラバースされるまで、より適切な場合に最適な値を置き換えます。

2つの数値の合計を求める

より複雑になるのは、最も近い2つの数値の合計を見つけることです。最も単純なアイデアは、前のケースに還元し、最初にターゲット値から1つの値を減算してから、残りの値を探すことですが、この方法では、ネストされたforループのために時間の複雑さがあまりフレンドリーではなく、最適化の余地があります。

問題は次のとおりです:最適化の余地はどこにありますか?スペースのこの部分を節約する方法は?

上記の方法の問題は、最初の値がすでにターゲット値よりも小さい場合、負の値を追加してもターゲットになる可能性がさらに低くなることです。次のステップは、a + bすでに目標値よりも小さい場合、bより小さい値を見つけてaに追加する必要はまったくありません。

  • 順序付けられた配列とダブルポインター
    • 次に、最初に配列をソートし、次に順序付けられた配列を取得します
    • 次に、左と右のポインタがそれぞれ最初と最後を指し、それらを加算して合計を取得し、次に、目標値に近いベストと合計を比較します
    • そして、その合計が目標値よりも大きいか小さいかを判断し、大きい場合は右ポインタを左に移動し、小さい場合は左ポインタを右に移動します。

3つの数値の合計を求めます

最初の2回の経験が得られたので、2つの数値の合計を求めることに変換します。つまり、最初に固定値を探し、次にダブルポインターを探します。

コード

public  int threeSumClosest(int[] nums, int target) {
    
    
        // 先将数组排序以便和后续双指针运算
        Arrays.sort(nums);
        int len = nums.length;
        // 赋值默认初始值,
        int best = nums[0] + nums[1] + nums[2];
        int sum = 0;
        // 固定a找b和c
        for (int a = 0; a < len; a++) {
    
    
            // 为了防止重复查找 b=a+1;
            int b = a + 1;
            int c = len - 1;
            while (b < c) {
    
    
                sum = nums[a] + nums[b] + nums[c];
                if (sum == target) {
    
    
                    return sum;
                }
                // 判断是否需要更新最佳值
                if (Math.abs(sum - target) < Math.abs(best - target)) {
    
    
                    best = sum;
                }
                // 判断双指针哪一个需要移动
                if (sum > target) {
    
    
                    c--;
                } else {
    
    
                    b++;
                }
            }
        }
        return best;
    }

やっと

  • 本を読んだ後、ご褒美をいただいた場合は、高く評価していただければ幸いです。更新の最大の動機になりますので、よろしくお願いします。
  • 私の公式アカウント[java Toka Fox]に注意を払い、javaとコンピューターの基本的な知識に焦点を当て、それを読んだ後に何かが確実に得られるように、皆さんを歓迎します。私を信じていない場合は、私を叩いてください
  • 読んだ後で別の意見や提案がある場合は、コメントして共有してください。ご愛顧ありがとうございます。

おすすめ

転載: blog.csdn.net/issunmingzhi/article/details/106969848