Welcome to Subscribe On Youtube

3588. Find Maximum Area of a Triangle

Description

You are given a 2D array coords of size n x 2, representing the coordinates of n points in an infinite Cartesian plane.

Find twice the maximum area of a triangle with its corners at any three elements from coords, such that at least one side of this triangle is parallel to the x-axis or y-axis. Formally, if the maximum area of such a triangle is A, return 2 * A.

If no such triangle exists, return -1.

Note that a triangle cannot have zero area.

 

Example 1:

Input: coords = [[1,1],[1,2],[3,2],[3,3]]

Output: 2

Explanation:

The triangle shown in the image has a base 1 and height 2. Hence its area is 1/2 * base * height = 1.

Example 2:

Input: coords = [[1,1],[2,2],[3,3]]

Output: -1

Explanation:

The only possible triangle has corners (1, 1), (2, 2), and (3, 3). None of its sides are parallel to the x-axis or the y-axis.

 

Constraints:

  • 1 <= n == coords.length <= 105
  • 1 <= coords[i][0], coords[i][1] <= 106
  • All coords[i] are unique.

Solutions

Solution 1

  • class Solution {
        public long maxArea(int[][] coords) {
            long ans = calc(coords);
            for (int[] c : coords) {
                int tmp = c[0];
                c[0] = c[1];
                c[1] = tmp;
            }
            ans = Math.max(ans, calc(coords));
            return ans > 0 ? ans : -1;
        }
    
        private long calc(int[][] coords) {
            int mn = Integer.MAX_VALUE, mx = 0;
            Map<Integer, Integer> f = new HashMap<>();
            Map<Integer, Integer> g = new HashMap<>();
    
            for (int[] c : coords) {
                int x = c[0], y = c[1];
                mn = Math.min(mn, x);
                mx = Math.max(mx, x);
                if (f.containsKey(x)) {
                    f.put(x, Math.min(f.get(x), y));
                    g.put(x, Math.max(g.get(x), y));
                } else {
                    f.put(x, y);
                    g.put(x, y);
                }
            }
    
            long ans = 0;
            for (var e : f.entrySet()) {
                int x = e.getKey();
                int y = e.getValue();
                int d = g.get(x) - y;
                ans = Math.max(ans, (long) d * Math.max(mx - x, x - mn));
            }
            return ans;
        }
    }
    
    
  • class Solution {
    public:
        long long maxArea(vector<vector<int>>& coords) {
            auto calc = [&]() -> long long {
                int mn = INT_MAX, mx = 0;
                unordered_map<int, int> f, g;
                for (auto& c : coords) {
                    int x = c[0], y = c[1];
                    mn = min(mn, x);
                    mx = max(mx, x);
                    if (f.count(x)) {
                        f[x] = min(f[x], y);
                        g[x] = max(g[x], y);
                    } else {
                        f[x] = y;
                        g[x] = y;
                    }
                }
                long long ans = 0;
                for (auto& [x, y] : f) {
                    int d = g[x] - y;
                    ans = max(ans, 1LL * d * max(mx - x, x - mn));
                }
                return ans;
            };
    
            long long ans = calc();
            for (auto& c : coords) {
                swap(c[0], c[1]);
            }
            ans = max(ans, calc());
            return ans > 0 ? ans : -1;
        }
    };
    
    
  • class Solution:
        def maxArea(self, coords: List[List[int]]) -> int:
            def calc() -> int:
                mn, mx = inf, 0
                f = {}
                g = {}
                for x, y in coords:
                    mn = min(mn, x)
                    mx = max(mx, x)
                    if x in f:
                        f[x] = min(f[x], y)
                        g[x] = max(g[x], y)
                    else:
                        f[x] = g[x] = y
                ans = 0
                for x, y in f.items():
                    d = g[x] - y
                    ans = max(ans, d * max(mx - x, x - mn))
                return ans
    
            ans = calc()
            for c in coords:
                c[0], c[1] = c[1], c[0]
            ans = max(ans, calc())
            return ans if ans else -1
    
    
  • func maxArea(coords [][]int) int64 {
    	calc := func() int64 {
    		mn, mx := int(1e9), 0
    		f := make(map[int]int)
    		g := make(map[int]int)
    		for _, c := range coords {
    			x, y := c[0], c[1]
    			mn = min(mn, x)
    			mx = max(mx, x)
    			if _, ok := f[x]; ok {
    				f[x] = min(f[x], y)
    				g[x] = max(g[x], y)
    			} else {
    				f[x] = y
    				g[x] = y
    			}
    		}
    		var ans int64
    		for x, y := range f {
    			d := g[x] - y
    			ans = max(ans, int64(d)*int64(max(mx-x, x-mn)))
    		}
    		return ans
    	}
    
    	ans := calc()
    	for _, c := range coords {
    		c[0], c[1] = c[1], c[0]
    	}
    	ans = max(ans, calc())
    	if ans > 0 {
    		return ans
    	}
    	return -1
    }
    
    
  • function maxArea(coords: number[][]): number {
        function calc(): number {
            let [mn, mx] = [Infinity, 0];
            const f = new Map<number, number>();
            const g = new Map<number, number>();
    
            for (const [x, y] of coords) {
                mn = Math.min(mn, x);
                mx = Math.max(mx, x);
                if (f.has(x)) {
                    f.set(x, Math.min(f.get(x)!, y));
                    g.set(x, Math.max(g.get(x)!, y));
                } else {
                    f.set(x, y);
                    g.set(x, y);
                }
            }
    
            let ans = 0;
            for (const [x, y] of f) {
                const d = g.get(x)! - y;
                ans = Math.max(ans, d * Math.max(mx - x, x - mn));
            }
            return ans;
        }
    
        let ans = calc();
        for (const c of coords) {
            [c[0], c[1]] = [c[1], c[0]];
        }
        ans = Math.max(ans, calc());
        return ans > 0 ? ans : -1;
    }
    
    

All Problems

All Solutions