Cho mảng số nguyên không âm, đếm số bộ ba chỉ số (i, j, k) sao cho ba cạnh tương ứng tạo thành tam giác (thỏa mãn bất đẳng thức tam giác).
Ví dụ: [2,2,3,4] → 3 bộ ba: (2,3,4) (2 lần), (2,2,3).
Thuật toán (Sắp xếp + Hai con trỏ)
- Sắp xếp mảng tăng dần.
- Duyệt
itừ cuối về 0 (cạnh lớn nhất). - Đặt
left=0, right=i-1. - Nếu
nums[left] + nums[right] > nums[i]→ tất cả cặp từleftđếnright-1vớirightđều hợp lệ → cộngright-left, giảmright. - Ngược lại tăng
left.
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int ret = 0, n = nums.size();
sort(nums.begin(), nums.end());
for (int i = n-1; i >= 0; i--) {
int left = 0, right = i-1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum > nums[i]) {
ret += right - left;
right--;
} else left++;
}
}
return ret;
}
};
int main() {
vector<int> v = {2,2,3,4};
Solution ob;
cout << ob.triangleNumber(v);
return 0;
}
Đầu vào / Đầu ra
Input: [2,2,3,4]
Output: 3