Hướng dẫn two sum python solution leetcode - hai tổng giải pháp python leetcode

num_lst = list(range(len(nums)))

for indx, num in enumerate(num_lst):

Tôi không chắc mình có thiếu thứ gì đó không, nhưng tôi nghĩ là không. Tôi đã chạy mã này

nums = [2,5,7,9]
num_lst = list(range(len(nums)))
list(enumerate(num_lst))

output : [(0, 0), (1, 1), (2, 2), (3, 3)]

Vậy tại sao bạn tạo danh sách và sau đó liệt kê nó? Có lẽ những gì bạn muốn làm chỉ đơn giản là: enumerate(nums) sau đó enumerate(nums[index+1:]) trên vòng lặp khác của bạn? Một cách đơn giản hơn sẽ chỉ sử dụng các phạm vi, như tôi sẽ hiển thị bên dưới.

Ngoài ra, với đầu vào của bạn, có khả năng một số duy nhất sẽ cao hơn mục tiêu, trong trường hợp này bạn không nên thực hiện lần lặp thứ hai.

Bạn cũng không cần else: continue, vì nó sẽ đến continue.

Tôi sẽ kết thúc với:

def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """

    for i1 in range(len(nums)):
        if nums[i1] > target:
            continue

        for i2 in range(i1 + 1, len(nums)):
            if nums[i1] + nums[i2] == target:
                return [i1, i2]

    return None

Không biết kích thước đầu vào dự kiến, thật khó để tập trung vào cải thiện hiệu suất. Mục tiêu chính của đánh giá của tôi là loại bỏ những gì dường như là một sự hiểu lầm trong mã của bạn và theo tôi, mã hiện rõ hơn.

Trong hướng dẫn này, chúng tôi sẽ thực hiện hai vấn đề tổng hợp bằng mã Python. Đây là vấn đề cơ bản của mảng và bạn có thể tìm thấy trên này trên LeetCode. Chúng tôi sẽ giải quyết nó bằng cách sử dụng một cách tiếp cận khác bằng ngôn ngữ lập trình Python. Hãy hiểu tuyên bố vấn đề.

Báo cáo vấn đề

Trong vấn đề này, chúng ta cần tìm cặp của hai phần tử từ danh sách đã cho có tổng bằng với giá trị mục tiêu đã cho. Chúng ta có thể giả định rằng mảng chỉ có một cặp số nguyên cộng vào tổng mục tiêu.

Lưu ý - Một danh sách hoặc mảng nhất định phải được sắp xếp theo cách ngày càng tăng.

Ví dụ 1

Output:

Ví dụ - 2

Output:

Chúng ta hãy giải quyết vấn đề này bằng cách sử dụng phương pháp tiếp cận vũ phu.

Cách tiếp cận - 1: Cách tiếp cận vũ lực

Cách tiếp cận vũ phu là một cách thường được sử dụng để giải quyết vấn đề. Trong phương pháp này, mục tiêu chính của chúng tôi là giải quyết vấn đề, không hiệu quả. Chúng tôi kiểm tra mọi cặp có thể và số lượng cặp có thể trong mảng. Chúng tôi sẽ sử dụng hai cho vòng lặp, thêm hai giá trị và so sánh giá trị đích. Nếu nó bằng với giá trị đích, hãy trả về các chỉ số của các cặp số nguyên.

Thuật toán -

  • Chạy vòng lặp đầu tiên để trỏ chỉ số đầu tiên của giải pháp trong mảng.
  • Chạy một vòng lặp khác để trỏ một chỉ số thứ hai của giải pháp cho mỗi số nguyên đầu tiên.
  • Nếu cả hai phần tử bằng với giá trị đích, hãy trả về cả hai giá trị chỉ số

Hãy thực hiện thuật toán bằng mã Python.

Thực hiện hai vấn đề tổng hợp

Thí dụ -

Output:

Giải trình -

Trong chương trình trên, chúng tôi đã tạo lớp twosum và khởi tạo hai biến Dist1 và Target. Sau đó, chúng tôi khai báo phương thức giải pháp () trong đó trước tiên chúng tôi đã kiểm tra độ dài của danh sách và áp dụng hai cho các vòng lặp. Lần đầu tiên cho vòng lặp là duy trì chỉ số đầu tiên và lần thứ hai cho vòng lặp là duy trì chỉ số thứ hai. Chúng tôi đã kiểm tra tổng của cả hai giá trị; Nếu đó là sự thật; Chúng tôi đã chỉ định một danh sách mới và trả về các chỉ số của các yếu tố.

Ví dụ - 2:

Output:

Cách tiếp cận -2: Sử dụng từ điển

Output:

Giải trình -

Trong chương trình trên, chúng tôi đã tạo lớp twosum và khởi tạo hai biến Dist1 và Target. Sau đó, chúng tôi khai báo phương thức giải pháp () trong đó trước tiên chúng tôi đã kiểm tra độ dài của danh sách và áp dụng hai cho các vòng lặp. Lần đầu tiên cho vòng lặp là duy trì chỉ số đầu tiên và lần thứ hai cho vòng lặp là duy trì chỉ số thứ hai. Chúng tôi đã kiểm tra tổng của cả hai giá trị; Nếu đó là sự thật; Chúng tôi đã chỉ định một danh sách mới và trả về các chỉ số của các yếu tố.solution() method. In this method, we declared a dictionary to keep track of all the values seen so far in the value to the index. Now, we iterate the given list using the enumerated. Then, we subtract the num value from the target value to search its pair. If the pair is found, return the index of both numbers. Otherwise, add it to our dictionary for a future visit.

Ví dụ - 2:

Cách tiếp cận -2: Sử dụng từ điển

Trong phương pháp này, chúng tôi đã tạo ra lớp twosum và bên trong nó, chúng tôi khai báo phương thức giải pháp (). Trong phương pháp này, chúng tôi đã tuyên bố một từ điển để theo dõi tất cả các giá trị được thấy cho đến nay trong giá trị của chỉ mục. Bây giờ, chúng tôi lặp lại danh sách đã cho bằng cách sử dụng được liệt kê. Sau đó, chúng tôi trừ đi giá trị num từ giá trị đích để tìm kiếm cặp của nó. Nếu cặp được tìm thấy, hãy trả lại chỉ số của cả hai số. Nếu không, hãy thêm nó vào từ điển của chúng tôi cho một chuyến thăm trong tương lai.

Độ phức tạp về thời gian của hai tổng số (cách tiếp cận lực lượng vũ phu) Only constant space for variable is used.

Chúng ta cần sử dụng hai cho các vòng. Đầu tiên cho vòng lặp truy cập n số phần tử và thứ hai cho các lần truy cập vòng lặp N-1. Do đó, việc kiểm tra cho tổng số có thể và tổng số cặp là: n*(n-1)/2, độ phức tạp thời gian sẽ là o (n*n) = n2.

Độ phức tạp không gian

0 (1): Chỉ sử dụng không gian không đổi cho biến.

Sử dụng từ điển, chỉ cần một cho vòng lặp để độ phức tạp về thời gian sẽ là O (n).

Cách tiếp cận - 3: Sử dụng hai con trỏ

Thí dụ -

Output:

Giải trình -

Trong chương trình trên, chúng tôi đã tạo lớp twosum và khởi tạo hai biến Dist1 và Target. Sau đó, chúng tôi khai báo phương thức giải pháp () trong đó trước tiên chúng tôi đã kiểm tra độ dài của danh sách và áp dụng hai cho các vòng lặp. Lần đầu tiên cho vòng lặp là duy trì chỉ số đầu tiên và lần thứ hai cho vòng lặp là duy trì chỉ số thứ hai. Chúng tôi đã kiểm tra tổng của cả hai giá trị; Nếu đó là sự thật; Chúng tôi đã chỉ định một danh sách mới và trả về các chỉ số của các yếu tố.

Ví dụ - 2:

Cách tiếp cận -2: Sử dụng từ điển Only constant space for the variable is used.

Trong phương pháp này, chúng tôi đã tạo ra lớp twosum và bên trong nó, chúng tôi khai báo phương thức giải pháp (). Trong phương pháp này, chúng tôi đã tuyên bố một từ điển để theo dõi tất cả các giá trị được thấy cho đến nay trong giá trị của chỉ mục. Bây giờ, chúng tôi lặp lại danh sách đã cho bằng cách sử dụng được liệt kê. Sau đó, chúng tôi trừ đi giá trị num từ giá trị đích để tìm kiếm cặp của nó. Nếu cặp được tìm thấy, hãy trả lại chỉ số của cả hai số. Nếu không, hãy thêm nó vào từ điển của chúng tôi cho một chuyến thăm trong tương lai.

Độ phức tạp về thời gian của hai tổng số (cách tiếp cận lực lượng vũ phu)

Chúng ta cần sử dụng hai cho các vòng. Đầu tiên cho vòng lặp truy cập n số phần tử và thứ hai cho các lần truy cập vòng lặp N-1. Do đó, việc kiểm tra cho tổng số có thể và tổng số cặp là: n*(n-1)/2, độ phức tạp thời gian sẽ là o (n*n) = n2.