【アルゴリズム叩き日記】03日目 - ダブルポインタアルゴリズム_有効な三角形の数とその和がsとなる2つの数

  

611. 有効な三角形の数

611. 有効な三角形の数icon-default.png?t=N6B9https://leetcode.cn/problems/valid-triangle-number/

タイトル説明:

非負の整数の配列を指定して nums 、三角形の辺を形成できるトリプルの数を返します。

問題解決のアイデア:

この問題は三角形が成り立つかどうかを問う問題です。まず、三角形の 3 つの辺 (a、b、c) があると仮定し、2 つの辺の和が 3 番目の辺より大きくなければなりません。

 

 タイトルからわかるように、数値の順序が狂っています。abc を 1 つずつ実験するとタイムアウトになります (時間計算量 O^3)。

ソートするときは、a<b<c であると仮定すると、a+b>c が true かどうかを判断するだけで済みます。

ここでは、各 c を (後ろから前に) 走査するので、時間計算量は N^2+NlogN、つまり N^2 になります。

問題解決コード:

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        //假设a<b<c
        int num=0;
        int n=nums.size();
        for(int i=n-1;i>=2;i--)
        {
            int left=0;
            int right=i-1;
            while(left<right)
            {
                if(nums[left]+nums[right]>nums[i])
                {
                    num+=(right-left);
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return num;
    }
};

  ソードはオファー 57 を指します。合計が s となる 2 つの数字

剣はオファー 57 を指します。合計が s となる 2 つの数字icon-default.png?t=N6B9https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

タイトル説明:

昇順にソートされた配列と数値 s を入力し、その合計が正確に s となる 2 つの数値を配列内で見つけます。複数の数値ペアの合計が s に等しい場合は、任意のペアを出力するだけです。

問題解決のアイデア: 

まず、この質問は昇順配列です、ここで暴力を振るうとタイムアウトになります

ここではダブルポインタを使用し、1 つは左側の頭部を指し、もう 1 つは右側の尾部を指します。ここでは、左、右、ターゲットの間に 3 つの関係があります。

sub=right-left と仮定します。

 最初のケースでは直接返すのは明らかですが、2 番目と 3 番目のケースを見てみましょう。

問題解決コード:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0;
        int right=n-1;
        while(nums[right]>target)
        {
            right--;
        }
        while(left<right)
        {
            int sub=target-nums[right];
            if(sub==nums[left])
            {
                return {nums[left],nums[right]};
            }
            else if(sub>nums[left])
            {
                left++;
            }
            else//sub<nums[left]
            {
                right--;
            }
        }
        return {-1,-1};
    }
};

 

 

おすすめ

転載: blog.csdn.net/m0_69061857/article/details/132380120