Menu
CoddyTech

3Sum

Bạn nhận được một danh sách số nguyên nums. Hãy tìm mọi bộ ba [a, b, c] gồm các giá trị lấy từ ba vị trí khác nhau trong nums, sao cho a + b + c = 0. Viết mỗi bộ ba theo thứ tự không giảm (a ≤ b ≤ c) và chỉ liệt kê mỗi bộ ba phân biệt một lần, ngay cả khi có nhiều cách chọn vị trí tạo ra bộ ba đó. Trả về các bộ ba đã sắp xếp theo giá trị đầu tiên, rồi đến giá trị thứ hai.

Hàm

threeSum(nums: integer-array) → integer-2d-array
numsinteger-array
danh sách số nguyên, có ít nhất ba phần tử
Trả vềinteger-2d-array
mọi bộ ba riêng biệt có tổng bằng 0, mỗi bộ được sắp xếp theo thứ tự không giảm, danh sách được sắp xếp

Ràng buộc

  • 3 ≤ nums.length ≤ 3000
  • -105 ≤ nums[i] ≤ 105
  • Ít nhất một bộ ba có tổng bằng 0.
  • Hai bộ ba giống nhau khi chúng chứa cùng ba giá trị.

Ví dụ

Đầu vào
nums = [-2, 0, 1, 1, -1, 2]
Đầu ra
[[-2, 0, 2], [-2, 1, 1], [-1, 0, 1]]
Giải thích
Ba bộ ba có tổng bằng 0. [-2, 1, 1] dùng giá trị 1 hai lần vì số 1 nằm ở hai vị trí; [-1, 0, 1] có thể dùng một trong hai số 1 nhưng chỉ xuất hiện một lần.
challenge icon

Câu hỏi mở rộng

Mẫu tương tự giải được bài toán 4Sum: cố định hai giá trị rồi dùng hai con trỏ cho phần còn lại. Bạn có thể viết lời giải với độ phức tạp O(n³) và xử lý đúng các giá trị trùng lặp ở mọi cấp không?

Đặt lại code
def threeSum(nums):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Đối số

nums = [-2, 0, 1, 1, -1, 2]

Đầu ra mong đợi

[[-2, 0, 2], [-2, 1, 1], [-1, 0, 1]]