@@ -75,32 +75,212 @@ tags:
7575
7676<!-- solution:start -->
7777
78- ### 方法一
78+ ### 方法一:枚举 + 哈希表
79+
80+ 题目要求三角形的两倍面积,因此我们可以直接计算三角形的底边和高的乘积。
81+
82+ 又因为三角形至少有一条边与 $x$ 轴或 $y$ 轴平行,我们可以枚举与 $x$ 轴平行的边,计算所有可能的三角形的两倍面积,然后将 $\textit{coords}$ 横纵坐标交换后,重复上述过程,计算与 $y$ 轴平行的边的所有可能的三角形的两倍面积。
83+
84+ 因此,我们设计一个函数 $\textit{calc}$ 来计算与 $y$轴平行的边的所有可能的三角形的两倍面积。
85+
86+ 我们用两个哈希表 $\textit{f}$ 和 $\textit{g}$ 来记录每个横坐标对应的最小纵坐标和最大纵坐标。然后我们遍历 $\textit{coords}$,更新哈希表 $\textit{f}$ 和 $\textit{g}$,同时记录横坐标的最小值和最大值。最后,我们遍历哈希表 $\textit{f}$,计算每个横坐标对应的三角形的两倍面积,并更新答案。
87+
88+ 在主函数中,我们先调用 $\textit{calc}$ 函数计算与 $y$ 轴平行的边的所有可能的三角形的两倍面积,然后将 $\textit{coords}$ 横纵坐标交换后,重复上述过程,计算与 $x$ 轴平行的边的所有可能的三角形的两倍面积。最后返回答案,如果答案为 0,则返回 -1。
89+
90+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是 $\textit{coords}$ 的长度。
7991
8092<!-- tabs:start -->
8193
8294#### Python3
8395
8496``` python
85-
97+ class Solution :
98+ def maxArea (self , coords : List[List[int ]]) -> int :
99+ def calc () -> int :
100+ mn, mx = inf, 0
101+ f = {}
102+ g = {}
103+ for x, y in coords:
104+ mn = min (mn, x)
105+ mx = max (mx, x)
106+ if x in f:
107+ f[x] = min (f[x], y)
108+ g[x] = max (g[x], y)
109+ else :
110+ f[x] = g[x] = y
111+ ans = 0
112+ for x, y in f.items():
113+ d = g[x] - y
114+ ans = max (ans, d * max (mx - x, x - mn))
115+ return ans
116+
117+ ans = calc()
118+ for c in coords:
119+ c[0 ], c[1 ] = c[1 ], c[0 ]
120+ ans = max (ans, calc())
121+ return ans if ans else - 1
86122```
87123
88124#### Java
89125
90126``` java
91-
127+ class Solution {
128+ public long maxArea (int [][] coords ) {
129+ long ans = calc(coords);
130+ for (int [] c : coords) {
131+ int tmp = c[0 ];
132+ c[0 ] = c[1 ];
133+ c[1 ] = tmp;
134+ }
135+ ans = Math . max(ans, calc(coords));
136+ return ans > 0 ? ans : - 1 ;
137+ }
138+
139+ private long calc (int [][] coords ) {
140+ int mn = Integer . MAX_VALUE , mx = 0 ;
141+ Map<Integer , Integer > f = new HashMap<> ();
142+ Map<Integer , Integer > g = new HashMap<> ();
143+
144+ for (int [] c : coords) {
145+ int x = c[0 ], y = c[1 ];
146+ mn = Math . min(mn, x);
147+ mx = Math . max(mx, x);
148+ if (f. containsKey(x)) {
149+ f. put(x, Math . min(f. get(x), y));
150+ g. put(x, Math . max(g. get(x), y));
151+ } else {
152+ f. put(x, y);
153+ g. put(x, y);
154+ }
155+ }
156+
157+ long ans = 0 ;
158+ for (var e : f. entrySet()) {
159+ int x = e. getKey();
160+ int y = e. getValue();
161+ int d = g. get(x) - y;
162+ ans = Math . max(ans, (long ) d * Math . max(mx - x, x - mn));
163+ }
164+ return ans;
165+ }
166+ }
92167```
93168
94169#### C++
95170
96171``` cpp
97-
172+ class Solution {
173+ public:
174+ long long maxArea(vector<vector<int >>& coords) {
175+ auto calc = [ &] ( ) -> long long {
176+ int mn = INT_MAX, mx = 0;
177+ unordered_map<int, int> f, g;
178+ for (auto& c : coords) {
179+ int x = c[ 0] , y = c[ 1] ;
180+ mn = min(mn, x);
181+ mx = max(mx, x);
182+ if (f.count(x)) {
183+ f[ x] = min(f[ x] , y);
184+ g[ x] = max(g[ x] , y);
185+ } else {
186+ f[ x] = y;
187+ g[ x] = y;
188+ }
189+ }
190+ long long ans = 0;
191+ for (auto& [ x, y] : f) {
192+ int d = g[ x] - y;
193+ ans = max(ans, 1LL * d * max(mx - x, x - mn));
194+ }
195+ return ans;
196+ };
197+
198+ long long ans = calc();
199+ for (auto& c : coords) {
200+ swap(c[0], c[1]);
201+ }
202+ ans = max(ans, calc());
203+ return ans > 0 ? ans : -1 ;
204+ }
205+ };
98206```
99207
100208#### Go
101209
102210``` go
211+ func maxArea (coords [][]int ) int64 {
212+ calc := func () int64 {
213+ mn , mx := int (1e9 ), 0
214+ f := make (map [int ]int )
215+ g := make (map [int ]int )
216+ for _ , c := range coords {
217+ x , y := c[0 ], c[1 ]
218+ mn = min (mn, x)
219+ mx = max (mx, x)
220+ if _ , ok := f[x]; ok {
221+ f[x] = min (f[x], y)
222+ g[x] = max (g[x], y)
223+ } else {
224+ f[x] = y
225+ g[x] = y
226+ }
227+ }
228+ var ans int64
229+ for x , y := range f {
230+ d := g[x] - y
231+ ans = max (ans, int64 (d)*int64 (max (mx-x, x-mn)))
232+ }
233+ return ans
234+ }
235+
236+ ans := calc ()
237+ for _ , c := range coords {
238+ c[0 ], c[1 ] = c[1 ], c[0 ]
239+ }
240+ ans = max (ans, calc ())
241+ if ans > 0 {
242+ return ans
243+ }
244+ return -1
245+ }
246+ ```
103247
248+ #### TypeScript
249+
250+ ``` ts
251+ function maxArea(coords : number [][]): number {
252+ function calc(): number {
253+ let [mn, mx] = [Infinity , 0 ];
254+ const f = new Map <number , number >();
255+ const g = new Map <number , number >();
256+
257+ for (const [x, y] of coords ) {
258+ mn = Math .min (mn , x );
259+ mx = Math .max (mx , x );
260+ if (f .has (x )) {
261+ f .set (x , Math .min (f .get (x )! , y ));
262+ g .set (x , Math .max (g .get (x )! , y ));
263+ } else {
264+ f .set (x , y );
265+ g .set (x , y );
266+ }
267+ }
268+
269+ let ans = 0 ;
270+ for (const [x, y] of f ) {
271+ const d = g .get (x )! - y ;
272+ ans = Math .max (ans , d * Math .max (mx - x , x - mn ));
273+ }
274+ return ans ;
275+ }
276+
277+ let ans = calc ();
278+ for (const c of coords ) {
279+ [c [0 ], c [1 ]] = [c [1 ], c [0 ]];
280+ }
281+ ans = Math .max (ans , calc ());
282+ return ans > 0 ? ans : - 1 ;
283+ }
104284```
105285
106286<!-- tabs:end -->
0 commit comments