Tìm một cặp phần tử từ một mảng có tổng bằng một số đã cho trong javascript
Cho một mảng n số nguyên và một số targetSum, hãy viết chương trình để xác định xem có một cặp phần tử nào trong mảng có tổng bằng targetSum không Show
ví dụ Input: X[] = [-5, 1, -40, 20, 6, 8, 7 ], targetSum = 15 Lưu ý quan trọng. Trước khi chuyển sang các giải pháp, chúng tôi khuyên người học giải quyết vấn đề này. Nếu giải quyết được thì tốt. Chúng tôi muốn nghe ý tưởng của bạn trong bình luận. Mặt khác, không vấn đề gì, đây là cơ hội để tìm hiểu một mô hình mới trong việc giải quyết vấn đề. Suy nghĩ và tận hưởng. ) Cách tiếp cận vũ phu bằng cách sử dụng các vòng lặp lồng nhauMột ý tưởng đơn giản là sử dụng hai vòng lặp lồng nhau và kiểm tra từng cặp (i, j) trong X[]. Nếu tồn tại một cặp có tổng bằng targetSum thì chúng ta trả về true, ngược lại, đến cuối cả hai vòng lặp nếu chúng ta không tìm thấy một cặp như vậy thì chúng ta trả về false Thuật toán Mã giảint sumPair (X[], n, targetSum) Phân tích độ phức tạp thời gian và không gianChúng tôi đang khám phá tất cả các cặp có thể có trong mảng và thực hiện các thao tác liên tục cho từng cặp. Tổng số không. số cặp có thể = nC2 = n(n-1)/2 = O(n²). Vì vậy, Độ phức tạp của thời gian = O(n²). chúng tôi đang sử dụng không gian bổ sung không đổi, Độ phức tạp của không gian = O(1). Nhưng câu hỏi quan trọng là - làm thế nào chúng ta có thể cải thiện độ phức tạp của thời gian hơn nữa? Có thể bạn quan tâm
Ý tưởng thuật toánMột ý tưởng khác là sắp xếp mảng và với mọi giá trị X[i], áp dụng tìm kiếm nhị phân để tìm giá trị targetSum — X[i] trong mảng. Tìm kiếm nhị phân thực hiện tìm kiếm trong O(logn) có thể giúp chúng tôi cải thiện độ phức tạp về thời gian. Nếu có targetSum — X[i] thì trả về 1 nếu không thì trả về false Các bước thuật toán
Thuật toán Mã giảint sumPair (X[], n, targetSum) Phân tích độ phức tạp thời gian và không gianGiả sử chúng ta đang sử dụng thuật toán sắp xếp O(nlogn) hiệu quả sắp xếp đống và thực hiện tìm kiếm nhị phân lặp đi lặp lại để tìm kiếm targetSum — X[i] n lần Độ phức tạp về thời gian = Độ phức tạp về thời gian của sắp xếp heap + n* Độ phức tạp về thời gian của tìm kiếm nhị phân = O(nlogn) + n. O(logn) = O(nlogn) + O(nlogn) = O(nlogn) Độ phức tạp không gian = Độ phức tạp không gian của sắp xếp heap + Độ phức tạp không gian của tìm kiếm nhị phân lặp = O(1) + O(1) = O(1) Sử dụng phương pháp sắp xếp và hai con trỏÝ tưởng thuật toánChúng ta có thể tối ưu hóa cách tiếp cận trên và tìm một phương pháp khác để tìm kiếm cặp trong mảng được sắp xếp không? Sắp xếp mảng và sau đó di chuyển hai con trỏ vào trong từ cả hai đầu của mảng, tại mỗi điểm nhìn vào tổng của chúng. Nếu tổng của cặp bằng targetSum, thì chúng ta đã hoàn thành và trả về true. Nhưng nếu tổng vượt quá giá trị của targetSum, thì bất kỳ tổng nào sử dụng phần tử lớn hơn đều quá lớn, vì vậy chúng tôi di chuyển con trỏ bên phải vào trong để có tổng nhỏ hơn. Nếu tổng nhỏ hơn targetSum, thì bất kỳ tổng nào sử dụng phần tử thấp hơn đều quá nhỏ, vì vậy chúng tôi di chuyển con trỏ bên trái vào trong để có tổng lớn hơn. Đến cuối quá trình này, nếu cả hai con trỏ giao nhau, cặp không có trong mảng và chúng tôi trả về false Các bước thuật toán
4. Nếu không tìm thấy một cặp như vậy trong toàn bộ mảng - trả về false Thuật toán Mã giảint sumPair(X[], int n, int targetSum) Phân tích độ phức tạp thời gian và không gianGiả sử chúng ta đang sử dụng thuật toán sắp xếp tại chỗ O(nlogn) heap sort. Nhưng bây giờ câu hỏi quan trọng là - độ phức tạp về thời gian của vòng lặp while của cách tiếp cận hai con trỏ là bao nhiêu? Trên cơ sở so sánh, chúng ta đang di chuyển con trỏ sang trái hoặc phải 1. Trong trường hợp xấu nhất, chúng tôi đang truy cập từng giá trị của mảng bằng hai con trỏ. Vì vậy, độ phức tạp thời gian của hai cách tiếp cận con trỏ = O(n) Độ phức tạp thời gian tổng thể = Độ phức tạp thời gian của sắp xếp đống + Độ phức tạp thời gian của vòng lặp while = O (n log n) + O(n) = O (n log n). Độ phức tạp không gian = O(1), chúng tôi sử dụng không gian bổ sung không đổi Ý tưởng thuật toánChúng tôi đã cải thiện độ phức tạp thời gian trong hai giải pháp cuối cùng, nhưng nó vẫn nằm trong phạm vi O(nlogn) do sự thống trị của thuật toán sắp xếp. Vì vậy, bây giờ câu hỏi quan trọng - làm thế nào chúng ta có thể tối ưu hóa hơn nữa để giải quyết nó bằng cách sử dụng độ phức tạp của thời gian tuyến tính? . Vì vậy, ý tưởng tốt nhất là sử dụng Bảng băm để cải thiện độ phức tạp về thời gian hơn nữa vì nó thực hiện tìm kiếm hiệu quả ở mức trung bình O(1) Vì vậy, ý tưởng sẽ là lặp lại mảng và chèn phần tử X[i] vào bảng Hash. Trước khi chèn X[i], chúng ta kiểm tra xem targetSum — X[i] đã tồn tại trong bảng chưa. Nếu nó tồn tại, chúng tôi đã tìm thấy một cặp có tổng bằng targetSum và chúng tôi trả về true Các bước thuật toán
Thuật toán Mã giảbool sumPair(int X[], int n, int targetSum) Phân tích độ phức tạp thời gian và không gianTrong trường hợp xấu nhất, chúng tôi quét toàn bộ mảng và không tìm thấy bất kỳ cặp nào như vậy. Tìm kiếm và chèn vào bảng băm là các hoạt động quan trọng Độ phức tạp về thời gian = Độ phức tạp về thời gian của việc chèn n phần tử vào bảng băm + Độ phức tạp về thời gian khi tìm kiếm targetSum — X[i] n lần vào bảng băm = n. O(1) + n. O(1) = O(n) + O(n) = O(n) Độ phức tạp không gian = O(n), chúng tôi đang sử dụng bảng băm có kích thước O(n) Lưu ý quan trọng. Chúng tôi khuyến nghị người học chuyển đổi các đoạn mã giả trên sang một ngôn ngữ lập trình yêu thích (C, C++, Java, Python, v.v. ) và xác minh tất cả các trường hợp thử nghiệm. Vui lòng cho chúng tôi biết nếu bạn tìm thấy bất kỳ lỗi hoặc lỗi nào; . Thích lập trình Các câu hỏi có thể có của Người phỏng vấn. Ý tưởng để suy nghĩ
So sánh độ phức tạp của thời gian và không gian
Đề xuất câu hỏi mã hóa để thực hành
Nếu bạn có bất kỳ ý tưởng/thắc mắc/nghi ngờ/phản hồi nào, vui lòng bình luận bên dưới hoặc viết thư cho chúng tôi tại [email protected] com. Thích học, Thích mã hóa, Thích thuật toán Làm cách nào để tìm tất cả các cặp mảng số nguyên có tổng bằng số đã cho JavaScript?Viết chương trình JavaScript để tìm một cặp phần tử (chỉ số của hai số) từ một mảng đã cho có tổng bằng một số mục tiêu cụ thể. Phiên bản ES6. function twoSum(nums, target_num) { const map = []; . chiều dài; . =
Làm cách nào tôi có thể lấy các phần tử từ mảng có tổng bằng với giá trị đã cho?Chương trình sẽ yêu cầu người dùng nhập vào mảng số nguyên (“Mảng đầu vào”) và tổng cần thiết (“Tổng bắt buộc”). Đầu ra (“Đầu ra”) sẽ liệt kê số lượng số nguyên nhỏ nhất từ mảng đầu vào tính tổng “Tổng bắt buộc”
Làm cách nào để tìm tất cả các cặp mảng số nguyên có tổng bằng một số đã cho trong Python?Chúng ta cần tìm tất cả các cặp có thể có từ mảng đã cho có tổng bằng tổng đã cho. . Đối với mỗi giá trị của i, lặp lại trên mảng từ chỉ số i cho đến độ dài của mảng bằng cách sử dụng biến j Kiểm tra xem mảng[i]+mảng[j] ==tổng đã cho Nếu điều kiện (2) ở trên là đúng thì in ra các cặp Làm cách nào để tìm tất cả các cặp mảng số nguyên có tổng bằng số đã cho trong C?Giải pháp sắp xếp. . Tạo ba biến trung gian left, right và countPair Khởi tạo các biến left, right, và countPair với giá trị lần lượt là 0, n-1 và 0 Bây giờ hãy sắp xếp mảng bằng hàm qsort sẵn có. . Nếu arr[leftIndex] + arr[rightIndex] bằng 'sum', thì chúng ta đã tìm thấy một cặp |