Giả sử chúng ta có một mảng số. Nó lưu n số nguyên, tồn tại ba phần tử a, b, c trong mảng sao cho a + b + c = 0. Tìm tất cả các bộ ba duy nhất trong mảng thỏa mãn điều kiện. Ví dụ, nếu mảng là [-1,0,1,2,-1,-4], kết quả sẽ là [[-1, 1, 0], [-1, -1, 2]].
Để giải quyết, chúng ta làm theo các bước sau:
- Sắp xếp mảng
nums, và định nghĩa mảngres. - Với
itừ 0 đến độ dàinums- 3:- Nếu
i > 0vànums[i] == nums[i-1], bỏ qua phần tiếp theo và tiếp tục. l := i + 1vàr := độ dài nums - 1.- Khi
l < r:sum := tổng của nums[i], nums[l] và nums[r].- Nếu
sum < 0, thìl := l + 1, ngược lại khisum > 0, thìr := r - 1. - Ngược lại chèn
nums[i], nums[l], nums[r]vào mảngres. - Khi
l < độ dài nums - 1vànums[l] == nums[l+1]:- Tăng
llên 1.
- Tăng
- Khi
r > 0vànums[r] == nums[r-1]:- Giảm
rđi 1.
- Giảm
- Tăng
llên 1 và giảmrđi 1.
- Nếu
- Trả về
res.
Ví dụ (Python)
Xem triển khai sau để hiểu rõ hơn:
class Solution(object):
def threeSum(self, nums):
nums.sort()
result = []
for i in range(len(nums)-2):
if i > 0 and nums[i] == nums[i-1]:
continue
l = i + 1
r = len(nums) - 1
while l < r:
sum = nums[i] + nums[l] + nums[r]
if sum < 0:
l += 1
elif sum > 0:
r -= 1
else:
result.append([nums[i], nums[l], nums[r]])
while l < len(nums)-1 and nums[l] == nums[l+1]:
l += 1
while r > 0 and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
return result
ob1 = Solution()
print(ob1.threeSum([-1,0,1,2,-1,-4]))
Đầu vào
[-1,0,1,2,-1,-4]
Đầu ra
[[-1,-1,2],[-1,0,1]]