diff --git a/docs/solutions/(array)/1-two-sum.mdx b/docs/solutions/(array)/1-two-sum.mdx new file mode 100644 index 0000000..6c7753f --- /dev/null +++ b/docs/solutions/(array)/1-two-sum.mdx @@ -0,0 +1,47 @@ +--- +title: '1. Two Sum' +description: You are given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target +sidebar: + label: 'Two Sum' + badge: 'Easy' +--- + +Hash Table + +::::warning +Can you come up with an algorithm that is less than O(n^2) time complexity? +:::: + +### Example 1: +- Input: `nums = [2,7,11,15], target = 9` +- Output: `[0,1]` +- Explanation: Because `nums[0] + nums[1]` == `9`, we return [0, 1]. + +### Example 2: +- Input: `nums = [3,2,4], target = 6` +- Output: `[1,2]` + +### Example 3: +- Input: `nums = [3,3], target = 6` +- Output: `[0,1]` + +### Constraints: + +- `2 <= nums.length <= 10^4` +- `-10^9 <= nums[i] <= 10^9` +- `-10^9 <= target <= 10^9` +- Only one valid answer exists. + +## Solution + +```py +class Solution: + def twoSum(self, nums: List[int], target: int) -> List[int]: + seen = {} + for i, num in enumerate(nums): + complement = target - num + if complement in seen: + return [seen[complement], i] + seen[num] = i + return [] +``` diff --git a/docs/solutions/(array)/15-3sum.mdx b/docs/solutions/(array)/15-3sum.mdx index f2baa05..9ca8ec4 100644 --- a/docs/solutions/(array)/15-3sum.mdx +++ b/docs/solutions/(array)/15-3sum.mdx @@ -34,12 +34,45 @@ Notice that the solution set must not contain duplicate triplets. ## Solution -```js -/** - * @param {number[]} nums - * @return {number[][]} - */ -var threeSum = function(nums) { - -}; +```py +class Solution: + def threeSum(self, nums: list[int]) -> list[list[int]]: + nums.sort() + result = [] + n = len(nums) + + for i in range(n): + # skip all zero + if i > 0 and nums[i] == nums[i - 1]: + continue + + # two pointers + left = i + 1 + right = n - 1 + target = -nums[i] + + while left < right: + current = nums[left] + nums[right] + + if current == target: + result.append([nums[i], nums[left], nums[right]]) + + # skip duplicates + while left < right and nums[left] == nums[left + 1]: + left += 1 + while left < right and nums[right] == nums[right - 1]: + right -= 1 + + # shift pointers + left += 1 + right -= 1 + + # since sorted, if current < target, then move left + elif current < target: + left += 1 + # since sorted, if current > target, then move right + else: + right -= 1 + + return result ``` diff --git a/docs/solutions/(array)/167-two-sum-ii-input-array-is-sorted.mdx b/docs/solutions/(array)/167-two-sum-ii-input-array-is-sorted.mdx index 9731302..0853ffd 100644 --- a/docs/solutions/(array)/167-two-sum-ii-input-array-is-sorted.mdx +++ b/docs/solutions/(array)/167-two-sum-ii-input-array-is-sorted.mdx @@ -37,27 +37,19 @@ Your solution must use only constant extra space. ## Solution -```js -/** - * @param {number[]} numbers - * @param {number} target - * @return {number[]} - */ -var twoSum = function(numbers, target) { - let i = 0, j = numbers.length - 1; +```py +class Solution: + def twoSum(self, numbers: List[int], target: int) -> List[int]: + i = 0 + j = len(numbers) - 1 - while (i < j) { - const curr = numbers[i] + numbers[j]; - if (curr === target){ - return [i + 1, j + 1]; - }else{ - if (curr < target){ - i++; - }else{ - j--; - } - } - } - return []; -}; + while i < j: + c = numbers[i] + numbers[j] + if c == target: + return [i + 1, j + 1] + elif c < target: + i+=1 + else: + j-=1 + return [] ```