알고리즘/LeetCode
1534. Count Good Triplets
앤테바
2022. 12. 29. 16:25
반응형
문제)
Given an array of integers arr, and three integers a, b and c. You need to find the number of good triplets.
A triplet (arr[i], arr[j], arr[k]) is good if the following conditions are true:
- 0 <= i < j < k < arr.length
- |arr[i] - arr[j]| <= a
- |arr[j] - arr[k]| <= b
- |arr[i] - arr[k]| <= c
Where |x| denotes the absolute value of x.
Return the number of good triplets.
Example 1:
Input: arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
Output: 4
Explanation: There are 4 good triplets: [(3,0,1), (3,0,1), (3,1,1), (0,1,1)].
Example 2:
Input: arr = [1,1,2,2,3], a = 0, b = 0, c = 1
Output: 0
Explanation: No triplet satisfies all conditions.
Constraints:
- 3 <= arr.length <= 100
- 0 <= arr[i] <= 1000
- 0 <= a, b, c <= 1000
솔루션1)
- brute-force로 for 루프 세개로 문제 해결
- 속도를 조금 빠르게 하기 위해서 두 번째 for 문에서 a 값 차이를 먼 확인해서 a 보다 크다면 3번째 for 루프는 skip
class Solution:
def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
# brute-force
count = 0
for i in range(len(arr)-2):
for j in range(i+1, len(arr)-1):
if (abs(arr[i]-arr[j])) > a:
continue
for k in range(j+1, len(arr)):
if (abs(arr[j]-arr[k])) <= b and (abs(arr[i]-arr[k])) <= c:
count += 1
return count
솔루션2)
- 조합 함수 combination() 함수를 사용해서 for 문을 대체
- 오히려 솔루션1 보다 결과가 느림. 솔루션1을 두 번째 for 문 단계에서 abs(arr[i]-arr[j])를 계산해서 a보다 큰 경우 3번째 for 문을 계산하지 않기때문에 더 빠름
class Solution:
def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
count = 0
for nums in combinations(arr, 3):
if abs(nums[0]-nums[1]) <= a and abs(nums[1] - nums[2]) <= b and abs(nums[0] - nums[2]) <= c:
count += 1
return count
반응형