[LeetCodeフォートナイトレースの23] 3.はあり重なって円や四角形(暴力、数学、ベクトル、トップソリューション)

1.ソースのタイトル

リンク:5361.が円や長方形をオーバーラップしています

0002タイトル

ここに画像を挿入説明
ここに画像を挿入説明

3.解決のタイトル

方法の一つ:暴力、従来のソリューション+

私はこの質問を無視して直接、私は私の職業すみません...

矩形の全ての点と決意の中心位置を介して、任意の二つの戻りの間の距離は、半径に等しい未満であればtrueそうでない場合は、ライン上のfalse行に。

暴力は無脳ので、私は、サンプルカードがされている思考けど、本当に言葉を描く、これは平面上の点の無限の数がある、しかし、ポイント整数限定されないことを考えるようになったので、最初にすべての暴力法を除外しています、私はとても残念私の専門職です。しかしまた、暴力行為の多くの欠陥が、もし大量のデータ、いくつかTLEの。

以下のコードを参照してください。

// 执行用时 :124 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :6 MB, 在所有 C++ 提交中击败了100.00%的用户

class Solution {
public:
    bool checkOverlap(int r, int x, int y, int x1, int y1, int x2, int y2) {
        for (int i = x1; i <= x2; ++i) {
            for (int j = y1; j <= y2; ++j) {
                if ((x - i) * (x - i) + (y - j) * (y - j) <= r * r) return true;
            }
        }
        return false;
    }
};

方法2:数学+巧妙なソリューション

これは、単純な計算幾何学です。画像の問題領域にギャングボローソリューション。
ここに画像を挿入説明
彼らはライン上の3例セグメントに宣告されました。非常に巧妙なソリューションを提供します。ここことに留意すべきであるC++とのデジタル複数のmin関数を評価しmin、あなたは中括弧、または曖昧を追加する必要があります。

class Solution {
public:
    bool checkOverlap(int r, int x, int y, int x1, int y1, int x2, int y2) {
        // 圆心在矩形内部
        if (x >= x1 and x <= x2 and y >= y1 and y <= y2) return true;
        //圆在正方形的 左 右 上 下 时的相交条件
        if ((y >= y1 and y <= y2 and x < x1 and x1 - x <= r) or 
            (y >= y1 and y <= y2 and x > x2 and x - x2 <= r) or 
            (x >= x1 and x <= x2 and y > y2 and y - y2 <= r) or 
            (x >= x1 and (x <= x2 and y < y1 and y1 - y <= r))) return true;
        return min({(x1 - x) * (x1 - x) + (y2 - y) * (y2 - y), (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y), 
                   (x2 - x) * (x2 - x) + (y1 - y) * (y1 - y), (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y)}) <= r * r;
    }
};

方法3:数学ベクトル+ + +トップは、変換ソリューションを座標

また、中に学んだ問題領域ソリューションに対する解決策から知られているほとんど兄貴Milo Yipはほとんど知られてのシェア。ギャングスターではほとんどあまりにも精巧ではない、非常に明確に説明して知っています。疑問は、メッセージ交換を残すことができます。この方法は、強力な拡張性を備えています。

以下のコードを参照してください。

// 执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :6 MB, 在所有 C++ 提交中击败了100.00%的用户

class Solution {
public:
    bool checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
        // (tx,ty)表示未变换之前的矩形中心
        int tx = (x1 + x2) / 2, ty = (y1 + y2) / 2; 
        // (tdx,tdy)表示变换之后的矩形中心
        int tdx = -tx, tdy = -ty; 
        // (x11,y11),(x21,y21)表示矩形的左下和右上端点
        int x11 = x1 + tdx, x21 = x2 + tdx, y11 = y1 + tdy, y21 = y2 + tdy;
        // (xc,yc)表示变换到第一象限的圆心坐标 
        int xc = abs(x_center + tdx), yc = abs(y_center + tdy); 
        // (ux,uy)表示u向量
        int ux = xc - x21, uy = yc - y21;
        // 将u向量中的x,y小于0的置为0
        ux = max(0, ux), uy = max(0, uy);
        // 判断
        return ux * ux + uy * uy <= radius * radius;  
    }
};
公開された406元の記事 ウォンの賞賛368 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/yl_puyu/article/details/105334972