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

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

#includeinclude <stdio.h>
#includeinclude <stdlib.h>
/*
Đưa ra một loạt các số nguyên, trả về các chỉ số của hai số sao cho chúng cộng vào một mục tiêu cụ thể.
Bạn có thể cho rằng mỗi đầu vào sẽ có chính xác một giải pháp.
*/
/***
* Lưu ý: Mảng được trả về phải được cắt bỏ, giả sử người gọi gọi miễn phí ().
*/
/*** twoSum(int* nums, int numsSize, int target) {
/*
Đưa ra một loạt các số nguyên, trả về các chỉ số của hai số sao cho chúng cộng vào một mục tiêu cụ thể.
Bạn có thể cho rằng mỗi đầu vào sẽ có chính xác một giải pháp.
*/
*/
/** *result = (int *)malloc(sizeof(int) * 2);
* Lưu ý: Mảng được trả về phải được cắt bỏ, giả sử người gọi gọi miễn phí (). i, j;
int* twosum (int* nums, int numSsize, int target) { a, b;
Một cách tốt hơn để làm điều đó là sử dụng bảng băm looping twice will not be efficient
Vòng lặp qua danh sách và xem nó có bổ sung nào trong băm không (i=0; i
phải tìm một C tương thích
int *result = (int *) malloc (sizeof (int) *2); (j=i+1; j
int i, j;
int a, b;("a:%d\n", a);
// lặp hai lần sẽ không hiệu quả("b:%d\n", b);
for (i = 0; i ((a + b) == target) {
a = nums [i];0] = i;
for (j = i+1; j1] = j;
b = nums [j]; result;
printf ("A:%d \ n", a);
printf ("A:%d \ n", a);
printf ("A:%d \ n", a);
b = nums [j]; result;
printf ("A:%d \ n", a);
printf ("b:%d \ n", b); main(int argc, char const *argv[])
if ((a + b) == target) {
kết quả [0] = i; code */
kết quả [1] = j; nums[] = {3, 2, 4};
kết quả trả lại; *data = twoSum(nums, 3, 6);
}("First: %d, second: %d\n", data[0], data[1]);
}(data);
intmain (int argc, charconst *argv []) 0;
printf ("A:%d \ n", a);

Báo cáo vấn đề

if ((a + b) == target) {

Đây là một bài viết khác trong loạt giải pháp vấn đề LeetCode và bài viết này là một giải pháp cho LeetCode 1 hai vấn đề tổng.

Một khi bạn có một sự hiểu biết tốt về hai vấn đề tổng, nó sẽ giúp bạn giải quyết các vấn đề cấp độ nâng cao như ba khoản tiền mà theo một cách nào đó, sự tiếp nối của hai vấn đề tổng.

Hãy xem xét bạn được cung cấp một loạt các số nguyên và tổng mục tiêu, trả về các chỉ số của hai số trong mảng sao cho chúng cộng vào mục tiêu đã cho. Bạn có thể cho rằng mỗi đầu vào sẽ có chính xác một giải pháp. Ngoài ra, bạn không thể sử dụng cùng một yếu tố hai lần. Bạn được phép trả lại câu trả lời theo bất kỳ thứ tự nào.

Thí dụ

if ((a + b) == target) {

Ví dụ 1:

Input: nums = [7,2,13,11], target = 9
Output: [0,1]

Ví dụ 2:

Input: nums = [7,3,5], target = 8
Output: [1,2]

Dung dịch

Hãy để chúng tôi cố gắng hiểu tuyên bố vấn đề trước. Ở đây chúng tôi được cung cấp một mảng các phần tử số nguyên và tổng mục tiêu. Công việc của chúng tôi là viết một thuật toán trả về các chỉ số của hai phần tử trong mảng này sao cho, khi chúng tôi thêm hai yếu tố này, nó phải bằng tổng mục tiêu được đưa ra.

Chẳng hạn, trong ví dụ 1 [7,2,13,11] là mảng đã cho và tổng mục tiêu đã cho = 9. Nếu chúng ta nhìn vào mảng đã cho, cặp thêm vào tổng mục tiêu 9 là (7, 7, 2) tức là 7+2 = 9. Vì vậy, thuật toán của chúng tôi sẽ trả về (0,1) do kết quả vì đây là các chỉ số của các phần tử 7 và 2 tương ứng trong mảng đã cho.

Tương tự đối với mảng trong đầu ra Ví dụ 2 [7,3,5] là (1,2) vì đây là các chỉ mục của các phần tử 3 và 5 tương ứng cộng với tổng mục tiêu 8.

Lưu ý: Nếu có nhiều cặp như vậy, chúng ta cần trả về các chỉ mục của cặp đầu tiên mà chúng ta tìm thấy từ trái.: If there are multiple such pairs we need to return the indexes of first pair we find from left.

Nó được nêu trong tuyên bố vấn đề rằng chúng ta có thể trả về các chỉ số theo bất kỳ thứ tự nào, điều này có nghĩa là gì? Hãy cho chúng tôi hiểu điều này với ví dụ 1. Đầu ra cho ví dụ này là [0,1], vì vậy khi câu lệnh vấn đề nói rằng chúng ta có thể trả về các chỉ số theo bất kỳ thứ tự nào có nghĩa là chúng ta có thể trả về [0,1] hoặc [ 1,0] Là đầu ra của chúng tôi, cả hai sẽ được coi là chính xác. Tương tự cho ví dụ 2, chúng ta có thể trả về [1,2] hoặc [2,1].

Giải pháp 1: Lực lượng vũ phu

Một giải pháp thẳng về phía trước cho vấn đề này là kiểm tra mọi cặp có thể có trong mảng đã cho.

Đối với một num mảng đầu vào đã cho, chúng ta cần thực hiện các bước sau:nums we need to do the following steps:

  1. Chạy hai vòng và kiểm tra mọi kết hợp trong mảng đã cho.

  2. Khắc phục vòng lặp bên ngoài ở một chỉ mục cụ thể và di chuyển vòng bên trong để có được tất cả các cặp có thể. Vòng ngoài chạy từ I = 0 đến I = N-2 và vòng lặp bên trong chạy từ J = I+1 đến J = N-1.

  3. Trong mỗi lần lặp của vòng lặp bên trong, kiểm tra xem các số được biểu thị bởi các chỉ mục vòng bên ngoài và bên trong có thêm vào tổng mục tiêu không.

  4. Nếu NUMS [OuterLoopindex] + Nums [InsideLoopindex] bằng với mục tiêu, return {outerLoopindex, innerLoopindex}. Khác tiếp tục lặp lại để kiểm tra cặp tiếp theo.nums[outerLoopIndex] + nums[innerLoopIndex] is equal to target, return {outerLoopIndex, innerLoopIndex} as result. Else continue iteration to check for the next pair.

  5. Lặp lại các bước trên cho đến khi bạn tìm thấy một sự kết hợp cộng vào mục tiêu đã cho.

Ví dụ: đối với mảng [7,2,13,11] và tổng mục tiêu 24, chúng tôi sửa vòng lặp bên ngoài tại INDEX I = 0 I.E phần tử 7 và kiểm tra nó với tất cả các giá trị có thể của vòng lặp bên trong từ J = I+1 đến J = N-1, tức là từ chỉ số 1 đến 3. Vì vậy, chúng ta sẽ kiểm tra cặp phần tử sau trong lần lặp đầu tiên của vòng lặp bên ngoài: (7,2) (7,13) và (7,11). Bây giờ chúng tôi tăng chỉ số vòng ngoài I bằng 1 và kiểm tra nó với các chỉ số 2 đến 3 (i+1 đến n-1) của vòng lặp bên trong. Chúng tôi lặp lại điều này cho đến khi chúng tôi tìm thấy câu trả lời cần thiết.

Lưu ý: N Đây là kích thước của mảng.: n here is the size of the array.

Mã số

Ngôn ngữ: Đi

Trong trường hợp xấu nhất, thuật toán này có độ phức tạp thời gian chạy của O (n^2). Trường hợp xấu nhất sẽ xảy ra khi sự kết hợp cần thiết là sự kết hợp cuối cùng được kiểm tra bởi các vòng lặp của chúng tôi.

Phân tích độ phức tạp

Độ phức tạp về thời gian: O (N^2) Độ phức tạp không gian: O (1)

Bạn muốn làm chủ mã hóa? Tìm kiếm để học các kỹ năng mới và phỏng vấn crack? Chúng tôi khuyên bạn nên khám phá các khóa học được thiết kế riêng này:

  1. Hướng dẫn video Udemy - có sẵn ở mức giảm 95%- Available at 95% off

  2. Hướng dẫn phỏng vấn thiết kế hệ thống hoàn chỉnh

  3. Phá vỡ cuộc phỏng vấn mã hóa - Sách ưa thích nhất cho các cuộc phỏng vấn mã hóa

  4. Cấu trúc dữ liệu và thuật toán - Hướng dẫn đầy đủ

  5. Học các kỹ năng công nghệ theo yêu cầu và đi trước những người khác

Giải pháp 2: Sử dụng Hashmap

Có thể giải quyết vấn đề này trong thời gian tuyến tính. Ý tưởng là sử dụng Hashmap để lưu trữ các chỉ số của các yếu tố đã được truy cập. Hashmap "khóa" là số trong mảng đầu vào đã cho (bạn thêm nó vào hashmap khi bạn truy cập từng phần tử). Hashmap "Giá trị" là chỉ số của số trong mảng được biểu thị bằng khóa HashMap.

Đối với một mảng đầu vào đã cho, thuật toán này thực hiện các bước sau:

  1. Tạo một hashmap chấp nhận kiểu dữ liệu số nguyên làm khóa và giá trị.

  2. Lặp qua từng phần tử trong mảng đã cho bắt đầu từ phần tử đầu tiên.

  3. Trong mỗi lần kiểm tra lần lặp nếu số yêu cầu (số yêu cầu = tổng mục tiêu - số hiện tại) có trong Hashmap.

  4. Nếu có, return {Chỉ mục số yêu cầu, kết quả số số hiện tại}.

  5. Mặt khác, thêm số lặp hiện tại làm khóa và chỉ mục của nó làm giá trị vào HashMap. Lặp lại điều này cho đến khi bạn tìm thấy kết quả.

Mô phỏng

Hãy xem xét bạn được cung cấp mảng đầu vào dưới đây và Target = 24.

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

Đặt Curridx là biến thể hiện phần tử hiện tại theo quy trình và để IDXMAP là bản đồ chỉ mục của chúng tôi. Các tế bào được đánh dấu trong màu cam cho thấy phần tử mảng hiện đang được xử lý.currIdx be the variable representing current element under process and let idxMap be our index map. Cells marked in orange indicate the currently processed array element.

Lúc đầu, Curridx = 0 và IDXMAP trống như trong hình đầu tiên bên dưới. Tiếp theo, chúng tôi kiểm tra xem số cần thiết = mục tiêu - số hiện tại có trong IDXMAP.currIdx = 0 and idxMap is empty as shown in first figure below. Next we check if the required number = target - current number is present in the idxMap.

Số yêu cầu = 24 - 7 = 17 không có trong hashmap của chúng tôi, vì vậy chúng tôi thêm 7 làm khóa IDXMAP và 0 là giá trị IDXMAP (0 là chỉ số của 7 trong mảng đầu vào) như trong Hình 2 bên dưới.idxMap key and 0 as idxMap value (0 is the index of 7 in input array) as shown in figure 2 below.

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

Tiếp theo, chúng tôi chuyển sang phần tử thứ hai trong mảng bằng cách tăng chỉ mục hiện tại. Vì vậy, Curridx = 1 chỉ vào phần tử 2 trong mảng. Một lần nữa, chúng tôi kiểm tra xem số yêu cầu có mặt trong IDXMAP hay không, số yêu cầu = 24 - 2 = 22 không có trong HashMap của chúng tôi, vì vậy chúng tôi thêm vào 2 vào Hashmap cùng với INDEX 1.currIdx = 1 which points to element 2 in array. Again we check if required number is present in idxMap, required number = 24 - 2 = 22 is not in our hashmap so we add to 2 to the hashmap along with its index 1.

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

Chỉ số dòng điện tăng, Curridx = 2, là phần tử 13 trong mảng đầu vào. Một lần nữa bắt buộc số = 24 - 13 = 11 không có trong Hashmap. Thêm {13: 2} vào IDXMAP. Tương tự được thể hiện trong sơ đồ dưới đây.currIdx = 2, which is element 13 in input array. Again required number = 24 - 13 = 11 is not in hashmap. Add {13:2} to idxMap. Same is shown in below diagram.

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

Hashmap của chúng tôi hiện chứa 3 yếu tố 7, 2 và 13 cùng với các chỉ mục của chúng. Một lần nữa chúng tôi tăng Curridx, Curridx = 3 là phần tử 11 trong mảng.currIdx, currIdx = 3 which is element 11 in array.

Bây giờ số yêu cầu = 24 - 11 = 13 có mặt trong IDXMAP (hiển thị bằng ô được tô sáng màu xanh lá cây trong hình thứ hai bên dưới). Điều đó có nghĩa là chúng tôi đã tìm thấy cặp cộng với tổng mục tiêu 24, tức là (11, 13). Do đó, chúng tôi trả lại các chỉ mục của 11 và 13 làm kết quả của chúng tôi. Chỉ số 11 không có gì ngoài Curridx là 3 và chỉ số 13 có thể được tìm thấy từ Hashmap là 2, do đó chúng ta trở lại (3, 2) hoặc (2, 3) là kết quả của chúng ta.idxMap (shown by cell highlighted in green in the second figure below). That means we have found the pair which adds up to the target sum 24, i.e. (11 , 13). Therefore we return the indexes of 11 and 13 as our result. Index of 11 is nothing but currIdx which is 3 and index of 13 can be found from hashmap which is 2, therefore we return (3 , 2) or (2 , 3) as our result.

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

Mã số

Ngôn ngữ: Đi

Ngôn ngữ: Python

Ngôn ngữ: Java

Phân tích độ phức tạp

Độ phức tạp về thời gian: O (n)

Độ phức tạp không gian: O (n)

Độ phức tạp thời gian chạy của giải pháp này là O (N) vì chúng ta sẽ phải trải qua tất cả các phần tử mảng trong trường hợp xấu nhất. Như được mô tả trong hai giải pháp tổng 1, trường hợp xấu nhất xảy ra khi sự kết hợp cần thiết là sự kết hợp cuối cùng được kiểm tra.

Ngoài ra, không gian phụ trợ được yêu cầu là O (N) vì chúng tôi lưu trữ các phần tử mảng trong HashMap và trong trường hợp xấu nhất, chúng tôi sẽ kết thúc việc lưu trữ tất cả các giá trị trong mảng đã cho trong HashMap.

Đó là tất cả cho bài viết này, cảm ơn bạn đã dành thời gian để đọc nó. Nếu bạn có bất kỳ câu hỏi hoặc nghi ngờ, xin vui lòng cho chúng tôi biết trong phần bình luận bên dưới, chúng tôi sẽ sẵn lòng trả lời bạn.

Nếu bạn thấy bài viết này hữu ích, đừng quên đăng ký trang web của chúng tôi, hỗ trợ của bạn thúc đẩy chúng tôi đưa ra nhiều bài viết như vậy trong tương lai (cuộn xuống cuối trang để tìm biểu mẫu đăng ký).

Bạn có thể khám phá thêm các bài viết tuyệt vời như vậy từ công thức mã trong phần blog của chúng tôi.

Mã Công thức Giới hạn Giới hạn Thời gian: Nhận giảm giá 100% cho Kế hoạch thành viên Công thức mã. Tham gia ngay bây giờ và có quyền truy cập độc quyền vào nội dung cao cấp miễn phí. Vội vàng! Cung cấp chỉ có sẵn trong một thời gian giới hạn - tham gia ngay bây giờ.Get 100% discount on Code Recipe Membership Plan. Join now and get exclusive access to premium content for free. Hurry! Offer only available for a limited time - Join now.

Theo dõi chúng tôi trên phương tiện truyền thông xã hội: Facebook, Twitter, LinkedIn, Tumblr, Instagram.Facebook, Twitter, Linkedin, Tumblr, Instagram.

Làm thế nào để bạn giải quyết một vấn đề hai lần?

Tuyên bố vấn đề Tìm tất cả các cặp số trong một mảng chưa được phân loại tổng số cho một mục tiêu số nhất định.Ví dụ: nếu mảng là [3, 5, 2, -4, 8, 11] và tổng là 7, chương trình của bạn sẽ trả về [[11, -4], [2, 5]] vì 11 + -4= 7 và 2 + 5 = 7.Find all the pairs of numbers in an unsorted array arr that sum to a given number target . For example, if the array is [3, 5, 2, -4, 8, 11] and the sum is 7 , your program should return [[11, -4], [2, 5]] because 11 + -4 = 7 and 2 + 5 = 7 .

Độ phức tạp thời gian của hai tổng là gì?

Độ phức tạp về thời gian: O (n 2) O (n^2) O (n2).Đối với mỗi yếu tố, chúng tôi cố gắng tìm ra bổ sung của nó bằng cách lặp qua phần còn lại của mảng mất thời gian o (n) o (n) o (n).Do đó, độ phức tạp thời gian là O (n 2) O (n^2) O (n2).Độ phức tạp không gian: O (1) O (1) O (1).O ( n 2 ) O(n^2) O(n2). For each element, we try to find its complement by looping through the rest of the array which takes O ( n ) O(n) O(n) time. Therefore, the time complexity is O ( n 2 ) O(n^2) O(n2). Space complexity: O ( 1 ) O(1) O(1).

Làm thế nào để bạn viết một giải pháp trong LeetCode?

Chỉ cần nhấp vào tab "TestCase", sửa đổi hoặc nhập trường hợp thử nghiệm của bạn vào hộp nhập và nhấp vào "Chạy mã".Chạy mã kết quả: Tính năng "Run Code" được cung cấp để giúp bạn gỡ lỗi mã của mình.Sau khi nhấp vào "Chạy mã", hệ thống sẽ thực thi mã của bạn và xuất kết quả dựa trên trường hợp kiểm tra hiện tại.click on the "Testcase" tab, modify or enter your test case in the input box, and click "Run Code". Run Code Result: "Run Code" feature is provided to help you debug your code. After clicking "Run Code", the system will execute your code and output the result based on the current test case.