Giải bài toán Two Number Sum?
Giải bài toán Two Number Sum?
Vấn đề đặt ra: Cho 1 array với các số integer khác biệt và 1 số đại diện cho target sum. Hãy implement 1 function mà bạn phải tim ra một cặp số trong array mà cộng lại = số target sum kia. Nếu tồn tại cặp số đó thì trả về, không thì trả về một empty array.
VD Input: twoNumberSum([3, 5, -4, 10, 11, 1, -1, 4], 10)
--> [11, -1]
Ký hiệu: TC - Time Complexity, SC - Space Complexity
Fact: trong thực tế, đa số sẽ ưu tiên trade Time complexity
hơn là Space
, vì ngày nay hạ tầng phần cứng đã tốt hơn rất nhiều so với ngày xưa, hơn có vài mb, thậm chí GB cũng chả là bao với các máy chủ hoặc hạ tầng Cloud!
Đây là cách đơn giản nhất, không phải nghĩ ngợi nhiều. Ta có 2 vòng lặp với array target. Ở vòng 1, ta đặt 1 biến tên là firstNum
với array[i]
, để rồi ở vòng 2, ta đặt 1 biến là secondNum
với array[j]
--> Cứ loop cho khi nào đến hết array, cặp này cộng lại = targetSum
thì return về [firstNum, secondNum]
, không có thì ta trả về empty array.
Về Complexity Analysis:
function twoNumberSum(array, targetSum) {
cons arrayLength = array.length
for (int i = 0; i < arrayLength; i++) {
const firstNum = array[i];
for (int j = i + 1; j < arrayLength; j++) {
const secondNum = array[j]
const isPairNum = (firstNum + secondNum) === targetSum;
if (isPairNum) return [firstNum, secondNum)
}
}
return []
}
func TwoNumberSum(array []int, target int) []int {
arrayLength := len(array)
for i, firstNum := range array {
for j := i + 1; j < arrayLength; j++ {
secondNum := array[j]
if firstNum + secondNum == target {
return []int{firstNum, secondNum}
}
}
}
return []int{}
}
Mục tiêu của ta là TC giảm xuống còn O(N-LogN), còn SC sẽ là O(N-LogN hoặc N), tuỳ thuộc vào phần tính chất của dữ liệu và thuật toán sort ta chọn.
firstIdx
và lastIdx
, đại diện cho giá trị index của mảng đóWhile loop
với điều kiện firstIdx < lastIdx
. Trong đó, có 1 biến currentSum
bằng với array[firstIdx] + array[lastIdx]
. Nếu currentSum
= targetSum
—> Return luôn. Còn không thì ta phải dựa vào currentSum < targetSum
, thì phải tăng firstIdx
lên 1, ngược lại thì giảm lastIdx
đi 1 - đó là lý do ta sort ở đầu tiên cho việc này.function twoNumberSum(array, targetSum) {
const sortedArray = […array].sort()
let firstIdx = 0;
let lastIdx = sortedArray.length - 1;
while (firstIdx < lastIdx) {
const currentSum = sortedArray[firstIdx] + sortedArray[lastIdx];
if (currentSum === targetSum) return [sortedArray[firstIdx], sortedArray[lastIdx]];
if (currentSum < targetSum) {
firstIdx++;
} else {
lastIdx—;
}
}
return []
}
func TwoNumberSum(array []int, target int) []int {
sortedArray := sort.Ints(array)
firstIdx, lastI...
junior
Gợi ý câu hỏi phỏng vấn
Chưa có bình luận nào