Given an integer array nums
, return the largest perimeter of a triangle with a non-zero area, formed from three of these lengths. If it is impossible to form any triangle of a non-zero area, return 0
.
Example 1:
Input: nums = [2,1,2] Output: 5 Explanation: You can form a triangle with three side lengths: 1, 2, and 2.
Example 2:
Input: nums = [1,2,1,10] Output: 0 Explanation: You cannot use the side lengths 1, 1, and 2 to form a triangle. You cannot use the side lengths 1, 1, and 10 to form a triangle. You cannot use the side lengths 1, 2, and 10 to form a triangle. As we cannot use any three side lengths to form a triangle of non-zero area, we return 0.
Constraints:
3 <= nums.length <= 104
1 <= nums[i] <= 106
program main
implicit none
integer, parameter :: n = 3
integer, dimension(n) :: nums
integer :: i, j, k, max_perimeter
! Examples
nums = [2, 1, 2]
write (*, '(A, I0)') 'Example 1: ', largestPerimeter(nums)
nums = [1, 2, 1, 10]
write (*, '(A, I0)') 'Example 2: ', largestPerimeter(nums)
contains
function largestPerimeter(nums) result(max_perimeter)
implicit none
integer, intent(in) :: nums(:)
integer :: i, j, k, perimeter
logical :: found
max_perimeter = 0
do i = 1, size(nums) - 2
do j = i + 1, size(nums) - 1
do k = j + 1, size(nums)
perimeter = nums(i) + nums(j) + nums(k)
if (perimeter > max_perimeter .and. &
nums(i) * nums(j) < nums(k)) then
max_perimeter = perimeter
end if
end do
end do
end do
end function largestPerimeter
end program main
temp.f95:16:57: 16 | function largestPerimeter(nums) result(max_perimeter) | 1 Error: Function result ‘max_perimeter’ at (1) has no IMPLICIT type temp.f95:11:4: 11 | nums = [1, 2, 1, 10] | 1 Error: Different shape for array assignment at (1) on dimension 1 (3 and 4)
module largest_triangle_perimeter
implicit none
private
public :: largest_triangle_perimeter
contains
function largest_triangle_perimeter(nums) result(largest_perimeter)
implicit none
integer, intent(in) :: nums(:)
integer :: largest_perimeter
integer :: i, j, k
integer :: a, b, c
largest_perimeter = 0
! Iterate over all possible combinations of three array elements
do i = 1, size(nums) - 2
do j = i + 1, size(nums) - 1
do k = j + 1, size(nums)
a = nums(i)
b = nums(j)
c = nums(k)
! Check if the three sides form a triangle
if (a**2 + b**2 >= c**2 .and. b**2 + c**2 >= a**2 .and. c**2 + a**2 >= b**2) then
! Check if the triangle has a non-zero area
if (a + b > c .and. b + c > a .and. c + a > b) then
largest_perimeter = max(largest_perimeter, a + b + c)
end if
end if
end do
end do
end do
end function largest_triangle_perimeter
end module largest_triangle_perimeter
program test_largest_triangle_perimeter
use largest_triangle_perimeter
implicit none
integer, parameter :: nums1(3) = [2, 1, 2]
integer, parameter :: nums2(4) = [1, 2, 1, 10]
integer, parameter :: nums3(5) = [3, 4, 5, 6, 7]
integer, parameter :: nums4(10) = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
integer :: largest_perimeter
largest_perimeter = largest_triangle_perimeter(nums1)
write (*,*) "Largest perimeter of a triangle with non-zero area from nums1:", largest_perimeter
largest_perimeter = largest_triangle_perimeter(nums2)
write (*,*) "Largest perimeter of a triangle with non-zero area from nums2:", largest_perimeter
largest_perimeter = largest_triangle_perimeter(nums3)
write (*,*) "Largest perimeter of a triangle with non-zero area from nums3:", largest_perimeter
largest_perimeter = largest_triangle_perimeter(nums4)
write (*,*) "Largest perimeter of a triangle with non-zero area from nums4:", largest_perimeter
end program test_largest_triangle_perimeter
temp.f95:4:40: 4 | public :: largest_triangle_perimeter | 1 Error: PUBLIC attribute applied to MODULE largest_triangle_perimeter at (1) temp.f95:8:39: 8 | function largest_triangle_perimeter(nums) result(largest_perimeter) | 1 Error: MODULE attribute of ‘largest_triangle_perimeter’ conflicts with PROCEDURE attribute at (1) temp.f95:9:21: 9 | implicit none | 1 Error: Unexpected IMPLICIT NONE statement in CONTAINS section at (1) temp.f95:10:38: 10 | integer, intent(in) :: nums(:) | 1 Error: Unexpected data declaration statement in CONTAINS section at (1) temp.f95:11:36: 11 | integer :: largest_perimeter | 1 Error: Unexpected data declaration statement in CONTAINS section at (1) temp.f95:12:26: 12 | integer :: i, j, k | 1 Error: Unexpected data declaration statement in CONTAINS section at (1) temp.f95:13:26: 13 | integer :: a, b, c | 1 Error: Unexpected data declaration statement in CONTAINS section at (1) temp.f95:15:29: 15 | largest_perimeter = 0 | 1 Error: Unexpected assignment statement in CONTAINS section at (1) temp.f95:18:32: 18 | do i = 1, size(nums) - 2 | 1 Error: Unexpected DO statement in CONTAINS section at (1) temp.f95:19:40: 19 | do j = i + 1, size(nums) - 1 | 1 Error: Unexpected DO statement in CONTAINS section at (1) temp.f95:20:40: 20 | do k = j + 1, size(nums) | 1 Error: Unexpected DO statement in CONTAINS section at (1) temp.f95:21:31: 21 | a = nums(i) | 1 Error: Unexpected assignment statement in CONTAINS section at (1) temp.f95:22:31: 22 | b = nums(j) | 1 Error: Unexpected assignment statement in CONTAINS section at (1) temp.f95:23:31: 23 | c = nums(k) | 1 Error: Unexpected assignment statement in CONTAINS section at (1) temp.f95:26:101: 26 | if (a**2 + b**2 >= c**2 .and. b**2 + c**2 >= a**2 .and. c**2 + a**2 >= b**2) then | 1 Error: Unexpected block IF statement in CONTAINS section at (1) temp.f95:28:75: 28 | if (a + b > c .and. b + c > a .and. c + a > b) then | 1 Error: Unexpected block IF statement in CONTAINS section at (1) temp.f95:29:81: 29 | largest_perimeter = max(largest_perimeter, a + b + c) | 1 Error: Unexpected assignment statement in CONTAINS section at (1) temp.f95:30:27: 30 | end if | 1 Error: Expecting END MODULE statement at (1) temp.f95:31:23: 31 | end if | 1 Error: Expecting END MODULE statement at (1) temp.f95:32:19: 32 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:33:15: 33 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:34:11: 34 | end do | 1 Error: Expecting END MODULE statement at (1) temp.f95:35:7: 35 | end function largest_triangle_perimeter | 1 Error: Expecting END MODULE statement at (1) temp.f95:39:9: 39 | use largest_triangle_perimeter | 1 Fatal Error: Cannot open module file ‘largest_triangle_perimeter.mod’ for reading at (1): No such file or directory compilation terminated.
def min_area_rect(points):
point_set = {(x, y) for x, y in points}
min_area = float('inf')
for p1 in point_set:
for p2 in point_set:
if p1[0] != p2[0] and p1[1] != p2[1]:
if (p1[0], p2[1]) in point_set and (p2[0], p1[1]) in point_set:
min_area = min(min_area, abs((p1[0] - p2[0]) * (p1[1] - p2[1])))
return min_area if min_area != float('inf') else 0
1. Convert the given points into a set for efficient lookups.
min_area
to an infinitely large value initially.p1
and p2
in the set, and check if two other points p3
and p4
exist such that p3.x = p1.x, p3.y = p2.y, p4.x = p2.x, p4.y = p1.y.p1
and p2
and update min_area
with the minimum value between current min_area
and calculated area.min_area
still holds the initial value (indicating no rectangles were found), return 0; otherwise, return the min_area
.#include <set>
#include <vector>
double minAreaRect(std::vector<std::vector<int>>& points) {
std::set<std::pair<int, int>> point_set;
for (const auto& point : points) {
point_set.emplace(point[0], point[1]);
}
double min_area = INT32_MAX;
for (const auto& p1 : point_set) {
for (const auto& p2 : point_set) {
if (p1.first != p2.first && p1.second != p2.second) {
if (point_set.count({p1.first, p2.second}) && point_set.count({p2.first, p1.second})) {
min_area = std::min(min_area, abs((p1.first - p2.first) * (p1.second - p2.second)));
}
}
}
}
return min_area == INT32_MAX ? 0 : min_area;
}
1. Convert the given points into a set for efficient lookups.
min_area
to an infinitely large value initially.p1
and p2
in the set, and check if two other points p3
and p4
exist such that p3.x = p1.x, p3.y = p2.y, p4.x = p2.x, p4.y = p1.y.p1
and p2
and update min_area
with the minimum value between current min_area
and calculated area.min_area
still holds the initial value (indicating no rectangles were found), return 0; otherwise, return the min_area
.