代码随想录day6 | 1. 两数之和 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
发布人:shili8
发布时间:2025-01-23 06:53
阅读次数:0
**代码随想录 Day6**
## 一、两数之和### 题目描述给定一个整数数组 `nums` 和一个目标值 `target`,找出两个数字的下标,使得它们加起来等于 `target`。你可以假设每个输入只有一种解。
### 示例1:
* 输入:`nums = [2,7,11,15]`, `target =9`
* 输出:`[0,1]`
### 示例2:
* 输入:`nums = [3,2,4], target =6`
* 输出:`[1,2]`
### 解决方案我们可以使用哈希表来解决这个问题。首先,我们遍历数组 `nums`,将每个数字及其下标存储在哈希表中。如果我们找到了一个数字 `x`,使得 `target - x` 也存在于哈希表中,那么我们就找到了一对数字,它们加起来等于 `target`。
def twoSum(nums, target):
num_dict = {}
for i, num in enumerate(nums):
if target - num in num_dict:
return [num_dict[target - num], i]
num_dict[num] = i return []
## 二、四数相加II### 题目描述给定一个整数数组 `nums` 和一个目标值 `target`,找出四个数字的下标,使得它们加起来等于 `target`。你可以假设每个输入只有一种解。
### 示例1:
* 输入:`nums = [1,0,-1,0,-2,2], target =0`
* 输出:`[3,5]`
### 解决方案我们可以使用哈希表来解决这个问题。首先,我们遍历数组 `nums`,将每个数字及其下标存储在哈希表中。如果我们找到了三个数字 `x`, `y`, 和 `z`,使得 `target - x - y - z` 也存在于哈希表中,那么我们就找到了一组四个数字,它们加起来等于 `target`。
def fourSum(nums, target):
num_dict = {}
for i, num in enumerate(nums):
if num not in num_dict:
num_dict[num] = [i]
else:
num_dict[num].append(i)
result = []
nums.sort()
for i in range(len(nums)):
for j in range(i +1, len(nums)):
left, right = j +1, len(nums) -1 while left < right:
current_sum = nums[i] + nums[j] + nums[left] + nums[right]
if current_sum == target:
result.append([nums[i], nums[j], 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 left +=1 right -=1 elif current_sum < target:
left +=1 else:
right -=1 return result## 三、赎金信### 题目描述给定两个字符串 `s1` 和 `s2`,找出其中一个字符串的子串,使得它在另一个字符串中出现。
### 示例1:
* 输入:`s1 = "hello"`, `s2 = "world"`
* 输出:`[]`
### 解决方案我们可以使用哈希表来解决这个问题。首先,我们遍历第一个字符串 `s1`,将每个子串及其出现次数存储在哈希表中。如果我们找到了一个子串 `x`,使得它也存在于第二个字符串 `s2` 中,那么我们就找到了一对子串,它们相似。
def findSubstring(s1, s2):
num_dict = {}
for i in range(len(s1)):
for j in range(i +1, len(s1) +1):
substring = s1[i:j]
if substring not in num_dict:
num_dict[substring] =1 else:
num_dict[substring] +=1 result = []
for i in range(len(s2)):
for j in range(i +1, len(s2) +1):
substring = s2[i:j]
if substring in num_dict and num_dict[substring] >0:
result.append([s1, s2])
# Skip duplicates while i < len(s2) and s2[i] == s2[i +1]:
i +=1 while j < len(s2) and s2[j -1] == s2[j]:
j -=1 i +=1 j -=1 return result## 四、三数之和### 题目描述给定一个整数数组 `nums` 和一个目标值 `target`,找出三个数字的下标,使得它们加起来等于 `target`。你可以假设每个输入只有一种解。
### 示例1:
* 输入:`nums = [-1,0,1,2,-1,-4]`, `target =0`
* 输出:`[(-1,-1,2), (-1,0,1)]`
### 解决方案我们可以使用哈希表来解决这个问题。首先,我们遍历数组 `nums`,将每个数字及其下标存储在哈希表中。如果我们找到了两个数字 `x` 和 `y`,使得 `target - x - y` 也存在于哈希表中,那么我们就找到了一组三个数字,它们加起来等于 `target`。
def threeSum(nums):
num_dict = {}
for i, num in enumerate(nums):
if num not in num_dict:
num_dict[num] = [i]
else:
num_dict[num].append(i)
result = []
nums.sort()
for i in range(len(nums)):
for j in range(i +1, len(nums)):
left, right = j +1, len(nums) -1 while left < right:
current_sum = nums[i] + nums[j] + nums[left]
if current_sum ==0:
result.append([nums[i], nums[j], nums[left]])
# Skip duplicates while left < right and nums[left] == nums[left +1]:
left +=1 while left < right and nums[right] == nums[right -1]:
right -=1 left +=1 right -=1 elif current_sum < 0:
left +=1 else:
right -=1 return result## 五、四数之和### 题目描述给定一个整数数组 `nums` 和一个目标值 `target`,找出四个数字的下标,使得它们加起来等于 `target`。你可以假设每个输入只有一种解。
### 示例1:
* 输入:`nums = [1,0,-1,0,-2,2], target =0`
* 输出:`[(-2,-1,1,2), (-2,0,0,2)]`
### 解决方案我们可以使用哈希表来解决这个问题。首先,我们遍历数组 `nums`,将每个数字及其下标存储在哈希表中。如果我们找到了三个数字 `x`, `y`, 和 `z`,使得 `target - x - y - z` 也存在于哈希表中,那么我们就找到了一组四个数字,它们加起来等于 `target`。
def fourSum(nums, target):
num_dict = {}
for i, num in enumerate(nums):
if num not in num_dict:
num_dict[num] = [i]
else:
num_dict[num].append(i)
result = []
nums.sort()
for i in range(len(nums)):
for j in range(i +1, len(nums)):
left, right = j +1, len(nums) -1 while left < right:
current_sum = nums[i] + nums[j] + nums[left] + nums[right]
if current_sum == target:
result.append([nums[i], nums[j], 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 left +=1 right -=1 elif current_sum < target:
left +=1 else:
right -=1 return result以上是解决三

