itint5 Place WIndow - 摆放窗口


http://www.meetqun.com/thread-3247-1-1.html
有一个H * W的屏幕,左上角坐标为(0,0),右下角坐标为(H,W)。屏幕中已有n个与坐标轴平行的矩形窗口,存放在数组rects中,第i个矩形窗口的左上坐标为(rects【i】.x1, rects【i】.y1),右下坐标为(rects【i】.x2, rects【i】.y2)。现需要放置一个h * w的新矩形窗口,使得新窗口与已有的窗口重叠的总面积最小。请计算最小的重叠总面积。)
已知条件:
• 已有的窗口都完全在屏幕中。
• 摆放的新窗口也要完全在屏幕中。
• 已有的窗口互相不重叠。
• W, H<=10000,n<=100。

http://www.cnblogs.com/lautsie/p/3529643.html
一种做法是:把矩形所占的方格都设为-1,就是个最大子矩阵和问题。复杂度o(w^2*h)或o(w*h^2),空间W*H
猜想应用场景是:电脑屏幕上已经有了n个聊天框,新建一个聊天框,放在屏幕的哪个位置最好。客户端计算的话,空间复杂度太高的算法应该是没法实际应用的。这种方法OJ也会空间超出。
另一种做法(贪心思想,和一个矩形覆盖最小):
所求矩形的上边要么贴着边界,要么贴着某个已有矩形的下边
所求矩形的下边要么贴着边界,要么贴着某个已有矩形的上边
所求矩形的左边要么贴着边界,要么贴着某个已有矩形的右边
所求矩形的右边要么贴着边界,要么贴着某个已有矩形的左边
总可以找到一个满足最小覆盖条件的矩形,这个矩形的边要么与大窗口的边缘重合,要么和已知矩形的边重合。可以使用常见的贪心思想证明,假设有任意一个满足最小覆盖条件的矩形,总可以将其移动到与已有的边重合。
这样,只需要枚举O(n^2)的左上点坐标,总的时间复杂度O(n^3)。
可以这样理解,假设已经把矩形放在一个位置了,先只考虑上下移动(左右同理),那么在上下边遇到另一条横边之前,往上移动覆盖面积要么单调递增要么单调递减(也可以覆盖不变),往下移动单调性相反。那么总能移动到和某一条边重合并比原来覆盖面积相等或更小的。所以假设已经找到一个满足最小覆盖条件的矩形,那么可以将其移动到与已有的边重合。
注意:求两个矩形相交部分的面积的写法也很值得参考。
int calOverlapping(Rect &a, Rect &b) {
    int x = max(0, min(a.x2, b.x2) - max(a.x1, b.x1));
    int y = max(0, min(a.y2, b.y2) - max(a.y1, b.y1));
    return x * y;
}
int minOverlapping(vector<Rect> &rects, int W, int H, int w, int h) {
    if (rects.size() == 0) return 0;
    vector<int> x, y;
    x.push_back(0); x.push_back(H-h);
    y.push_back(0); y.push_back(W-w);
     
    for (int i = 0; i < rects.size(); i++) {
        if (rects[i].x1 - h >= 0) x.push_back(rects[i].x1 - h);
        if (rects[i].y1 - w >= 0) y.push_back(rects[i].y1 - w);
        if (rects[i].x2 + h <= H) x.push_back(rects[i].x2);
        if (rects[i].y2 + w <= W) y.push_back(rects[i].y2);
    }
     
    int ans = w * h; // max is fully overlapped
    for (int i = 0; i < x.size(); i++) {
        for (int j = 0; j < y.size(); j++) {
            Rect r;
            r.x1 = x[i]; r.x2 = x[i] + h;
            r.y1 = y[j]; r.y2 = y[j] + w;
            int cal = 0;
            for (int k = 0; k < rects.size(); k++) {
                cal += calOverlapping(rects[k], r);
            }
            if (cal < ans) ans = cal;
        }
    }
    return ans;
}

http://www.meetqun.com/thread-3247-1-1.html
    public int minOverlapping(Rect[] rects, int W, int H, int w, int h) {
                if (rects.length == 0) {
                        return 0;
                }
                // All possible left top coordinate <x, y> for the candidate rectangle.8 t. T6 m)
                ArrayList<Integer> x = new ArrayList<Integer>();
                ArrayList<Integer> y = new ArrayList<Integer>();5 M(
                x.add(0);
                x.add(H - h);
                y.add(0);
                y.add(W - w);
                for (Rect rect : rects) {
            if (rect.x1 - h >= 0) {
                x.add(rect.x1 - h);  }:
            }
            if (rect.y1 - w >= 0) {
                y.add(rect.y1 - w);
            }( Y! v7 j. X. S7 N' u- ]% ^
            if (rect.x2 + h <= H) {
                x.add(rect.x2);
            }
            if (rect.y2 + w <= W) {
                y.add(rect.y2);
            }
                }
                ) x9 m1 k6 [5 ^
                int result =  w * h; // max overlapped area is fully overlapped' L.
                for (int i = 0; i < x.size(); i++) {
                        for (int j = 0; j < y.size(); j++) {
                                Rect rect = new Rect(x.get(i), y.get(j), x.get(i) + h, y.get(j) + w);  // One candidate rectangle
                                int area = 0;  // Total overlapped area!
                                for (Rect rectangle : rects) {
                                        area += calculateOverlapping(rectangle, rect);
                                }
                                result = Math.min(result, area);
                        }
                }
                return result;3 ~5 R+ L, x9 X8 F
    }
          ]
        // Calculate the overlapped area for rectangle a and b.
        private int calculateOverlapping(Rect a, Rect b) {
                int x = Math.max(0, Math.min(a.x2, b.x2) - Math.max(a.x1, b.x1));
                int y = Math.max(0, Math.min(a.y2, b.y2) - Math.max(a.y1, b.y1));
                return x * y;
         }
}

Max Sub Matrix
https://github.com/zdzapple/itint5/blob/master/%E6%91%86%E6%94%BE%E7%AA%97%E5%8F%A3.cpp
int maxConsSum(const vector<int> &arr, int w, int row)
{
int n = arr.size();

int curSum = 0;
for (int j = 0; j < w; ++ j)
    {
curSum += arr[j];
    }

    int maxSum = curSum;
for (int i = w; i <= n - 1; ++ i)
{
curSum = curSum - arr[i-w];
curSum += arr[i];
maxSum = max(curSum, maxSum);
}
return maxSum;
}

int minOverlapping(vector<Rect> &rects, int W, int H, int w, int h)
{
if (rects.empty())
return 0;
vector<vector<int> > matrix(H, vector<int>(W, 0));
for (int i = 0; i < rects.size(); ++ i)
{
for (int row = rects[i].x1; row < rects[i].x2; ++ row)
{
for (int col = rects[i].y1; col < rects[i].y2; ++ col)
{
matrix[row][col] = -1;
}
}
}
int result = INT_MIN;
vector<int> subMatrix(matrix[0].size(), 0);
for (int row = 0; row < H - h + 1; ++ row)
{
if (row == 0)
for (int j = row; j < row + h; ++ j)
{
for (int k = 0; k < matrix[0].size(); ++ k)
{
subMatrix[k] += matrix[j][k];
}
}
else {
for (int k = 0; k < matrix[0].size(); ++ k)
{
subMatrix[k] -= matrix[row-1][k];
subMatrix[k] += matrix[row+h-1][k];
}
}

result = max(result, maxConsSum(subMatrix, w, row));
}
return 0 - result;
}

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts