2ã¤ã®æ°ã®å
2ã¤ã®æ°ã®å
2ã¤ä»¥ä¸ã®ã¦ãã¼ã¯ãªæ°åã®éåA
ã®ä¸ãããã¿ã¼ã²ãã(target
)ã®æ°åã®åã¨ãªãæ°åã®ãã¢ãè¦ã¤ãåºããæ°åã®ãã¢ã¯æ大1ã¤ãããçãã¯å¤ãå°ããé ã«ä¸¦ã¹ãã¨ããã
ä¾ãã°A
ã1, 10, 5, -1ã12ãtarget
ã15ã§ããã°ãçãã¯10, 5ã®ãã¢ã§ãããA
ãæ°åã®é
åã®å¼æ°ãtarget
ãæ°åã®å¼æ°ã¨ãã¦ãããå®è£
ããã
ã¢ã«ã´ãªãºã å®è£ (1) O(n2)
æãç°¡åãªã¢ã«ã´ãªãºã ã¯äºéã«ã¼ããã¦ããã¹ã¦ã®è¦ç´ ã®åã®ãã¿ã¼ã³ãåºããã¨ãè¨ç®éã¯O(n^2)
ã使ç¨ãã¦ããsort
ã¯2ã¤ã®æ°å¤ã®æ¯è¼ãªã®ã§ç¡è¦ããã
function twoNumberSum(A, target) { for (let i = 0; i < A.length; i++) { for (let j = 0; j < A.length; j++) { if (i === j) continue; if (A[i] + A[j] === target){ return [A[i], A[j]].sort((a, b) => a - b) } } } return []; }
ã¢ã«ã´ãªãºã å®è£ (2) O(n)
è¨ç®ãçµããè¦ç´ ãé
åstore
ã«ä¿åãã¦ãããã¯ã³ã«ã¼ãã§æ¸ã¾ããè¨ç®éã¯O(n)
ã«ã¼ãä¸ã®æ°å¤ãx
ã¨ããã¨ããã¢ã«ãªãå¯è½æ§ã®ããæ°å¤y
ã¯target - x
ã¨è¡¨ãããstore
ã«y
ãåå¨ããªããã°ãx
ãstore
ã«ä¿åããã
ãã¡ãã使ç¨ãã¦ããsort
ã¯2ã¤ã®æ°å¤ã®æ¯è¼ãªã®ã§ç¡è¦ããã
function twoNumberSum(A, target) { const store = [] for (const x of A) { const y = target - x if (store.includes(y)) { return [x, y].sort((a, b) => a - b) } else { store.push(x) } } return []; }
includes
ã®å®è£
ãæ°ã«ãªããããã·ã¥ãã¼ãã«ã«ä¿åã®ã»ããããããï¼
ã¢ã«ã´ãªãºã å®è£ (3) O(n log n)
ã¾ããA
ãå°ããé ã«ä¸¦ã³æ¿ãããã½ã¼ãã«é¢ãã¦ã¯ãJavaScriptã®å®è£
ã¯ãã©ã¦ã¶ã«ããããããã§ã¯ã¯ã¤ãã¯ã½ã¼ããè¨ç®éO(n log n)
ã¨ããã
[-1, 1, 5, 10, 12]
ç¾å¨ã®æå°ã®å¤ã®ã¤ã³ããã¯ã¹ãmin
ãæ大ã®å¤ã®ã¤ã³ããã¯ã¹ãmax
ã¨ããã¨
sum = array[left] + array[right]
ã¨ãªããsum
ãtarget
ãã大ããå ´åãå¤ãå°ãããããã®ã§right
ãå°ãããããéã«sum
ãtarget
ããå°ããå ´åãå¤ã大ãããããã®ã§ãleft
ãå°ããããã
ä¾ãã°åæç¶æ
ã§left=0
ãright=4
ã§ããããsum=11
left right | | [-1, 1, 5, 10, 12]
target
ã¯ãããã大ããã®ã§left
ãå³ã«åããã¦left=1
ãright=4
ãªãã°sum=13
left right | | [-1, 1, 5, 10, 12]
target
ã¯ãããã大ããã®ã§left
ãå³ã«åããã¦left=2
ãright=4
ãªãã°sum=17
left right | | [-1, 1, 5, 10, 12]
target
ã¯ããããå°ããã®ã§right
ãå·¦ã«åããã¦left=2
ãright=3
ãªãã°sum=15
left right | | [-1, 1, 5, 10, 12]
ã¯ã¤ãã¯ã½ã¼ãã¨ä¸åã®ã«ã¼ãã®è¨ç®éã¯
O(n log n) + O(n) = O (n log n)
ã§ãããã¨ããO(n log n)
çãã®ãã¢ã¯ã¦ãã¼ã¯ãªæ°å¤ã¨ãªããã¨ã«æ³¨æãã¦ãããå®è£ ããã¨
function twoNumberSum(A, target) { A.sort((a, b) => a - b) let left = 0 let right = A.length - 1 while (left < right) { const sum = A[left] + A[right] if (sum === target) { return [A[left], A[right]] } else if (sum < target) { left++ } else if (sum > target) { right-- } } return []; }