Skip to content

Commit 3386dd3

Browse files
committed
update
update
1 parent a3ab16c commit 3386dd3

11 files changed

Lines changed: 234 additions & 38 deletions

File tree

leetcode_array/main.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
* [螺旋矩阵II](螺旋矩阵2.md)
1414

1515
<!--
16-
1. [两数之和](两数之和.md)
1716
2. [删除排序数组中的重复项](删除排序数组中的重复项.md)
1817
3. [移除元素](移除元素.md)
1918
4. [搜索插入位置](搜索插入位置.md)

leetcode_array/两数之和.md

Lines changed: 0 additions & 37 deletions
This file was deleted.

leetcode_hash/main.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,18 @@
11
# LeetCode哈希表
2+
## 定义
3+
**哈希表,也叫散列表,是可以通过关键字key访问映射表来得到value的地址,从而可以直接通过key获取其对应的value的值的数据结构,这个映射表也叫哈希函数,存放value的数组叫做哈希表。**
4+
5+
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
6+
7+
#### 哈希冲突:不同的key通过哈希计算,得到了相同的地址,就会产生哈希冲突。
8+
解决哈希冲突的方法:
9+
1. 链地址法:对Key通过哈希之后落在同一个地址上的值,做一个链表来进行存储同一个key对应的不同的值。
10+
2. 开放地址法:如果出现一个key2进行hash(key)后映射的位置与key1进行hash(key)后映射的位置一致(即发生了哈希冲突),那么从该位置往下寻找到第一个空位时将key2的数据放入。而从该位置往下寻找空闲位置的过程又称为探测。
11+
12+
## 题目
13+
* [有效的字母异位词](有效的字母异位词.md)
14+
* [两个数组的交集](两个数组的交集.md)
15+
* [快乐数](快乐数.md)
16+
* [两数之和](两数之和.md)
17+
* [四数相加II](四数相加II.md)
18+
* [赎金信](赎金信.md)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# 349.两个数组的交集
2+
## 题目
3+
给定两个数组,编写一个函数来计算它们的交集。
4+
```python
5+
输入:nums1 = [1,2,2,1], nums2 = [2,2]
6+
输出:[2]
7+
8+
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
9+
输出:[9,4]
10+
```
11+
12+
## 分析
13+
* 将列表转换为集合,集合的特性是去重,查找时间复杂度O(1)
14+
* 遍历其中一个集合,判断元素在另一个集合中是否出现
15+
* 时间复杂度O(m+n):其中m和n分别是两个数组的长度。使用两个集合分别存储两个数组中的元素需要O(m+n)的时间,遍历较小的集合并判断元素是否在另一个集合中需要O(min(m,n))的时间,因此总时间复杂度是O(m+n)。
16+
* 空间复杂度:O(m+n)
17+
18+
```python
19+
def intersection(nums1, nums2):
20+
set1 = set(nums1)
21+
set2 = set(nums2)
22+
if len(set1) < len(set2):
23+
# 遍历短的提高效率
24+
return [item for item in set1 if item in set2]
25+
return [item for item in set2 if item in set1]
26+
```

leetcode_hash/两数之和.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# 1.两数之和
2+
## 题目
3+
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
4+
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
5+
示例:
6+
```python
7+
给定 nums = [2, 7, 11, 15], target = 9
8+
因为 nums[0] + nums[1] = 2 + 7 = 9
9+
所以返回 [0, 1]
10+
11+
nums = [3,3],target=6
12+
[0,1]
13+
```
14+
15+
## 分析
16+
用字典存储每个元素及其对应的索引。时间复杂度O(n),空间复杂度O(n)
17+
18+
* 从前向后依次遍历数组中的元素。
19+
* 计算差值,如果差值不存在字典中,则保存当前遍历的元素到字典中。
20+
* 如果差值存在字典中,返回差值的索引与当前元素的索引。
21+
22+
```python
23+
def twoSum(nums, target):
24+
hash_table = {}
25+
for index, item in enumerate(nums):
26+
other = target - item
27+
if other in hash_table:
28+
return [index, hash_table[other]]
29+
hash_table[item] = index
30+
```

leetcode_hash/四数相加II.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 454.四数相加II
2+
## 题目
3+
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
4+
```python
5+
输入:
6+
A = [ 1, 2]
7+
B = [-2,-1]
8+
C = [-1, 2]
9+
D = [ 0, 2]
10+
输出:
11+
2
12+
解释:
13+
两个元组如下:
14+
1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
15+
2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
16+
```
17+
18+
## 分析
19+
*[两数之和](两数之和.md)有点相似,将四个数组分成两组,AB一组,CD一组
20+
* 对于A和B,使用二重循环对它们进行遍历,得到所有A[i]+B[j]的值并存入哈希映射中。每个键表示一种A[i]+B[j],对应的值为 A[i]+B[j]出现的次数。
21+
* 对于C和D,同样使用二重循环对它们进行遍历。当遍历到C[k]+D[l] 时,如果-(C[k]+D[l])出现在哈希映射中,那么将 -(C[k]+D[l])对应的值累加进答案中。
22+
* 时间复杂度O(n^2), 空间复杂度O(n^2)
23+
24+
```python
25+
def fourSumCount(A, B, C, D):
26+
# 记录AB两个数组元素两两相加之和及其次数
27+
hash_1 = dict()
28+
for index_1, item_1 in enumerate(A):
29+
for index_2, item_2 in enumerate(B):
30+
sum_ = item_1 + item_2
31+
hash_1[sum_] = hash_1.get(sum_, 0) + 1
32+
33+
ans = 0
34+
for index_1, item_1 in enumerate(C):
35+
for index_2, item_2 in enumerate(D):
36+
sum_ = item_1 + item_2
37+
if 0-sum_ in hash_1:
38+
ans += hash_1[0-sum_]
39+
40+
return ans
41+
```

leetcode_hash/快乐数.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# 202.快乐数
2+
## 题目
3+
编写一个算法来判断一个数 n 是不是快乐数。
4+
* 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
5+
* 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
6+
* 如果 可以变为 1,那么这个数就是快乐数。
7+
```python
8+
输入:19
9+
输出:true
10+
解释:
11+
1 + 81 = 82
12+
64 + 4 = 68
13+
36 + 64 = 100
14+
1 + 0 + 0 = 1
15+
```
16+
17+
## 分析
18+
* 可能最终会得到1
19+
* 可能最终会无限循环
20+
* 会不会无限增大
21+
22+
#### 为什么不会无限变大
23+
* 如果是一位数,最大为9,平方和最大是81
24+
* 如果是两位数,最大为99,平方和最大为162
25+
* 如果是三位数,最大为999,平方和最大为243
26+
* 如果是四位数,最大为9999,平方和最大为324
27+
28+
**所以对于三位数的整数,它的下一个数字(每个位置数字的平方和)不会大于243,对于四位和四位以上的整数,每次计算都会减小,最终变为三位数的整数,所以结果不会无限增大,算法可能会在243以下的所有数字上循环,然后回到它已经到过的一个循环或者回到1。**
29+
30+
**判断元素是否重复出现就要考虑使用哈希表。**
31+
* 逐个计算下一个数字,并将结果保存在哈希表中
32+
* 如果结果出现1,返回True
33+
* 如果出现重复的结果,说明出现循环,返回False
34+
![](../pic/leetcode_hash/202_1.png)
35+
![](../pic/leetcode_hash/202_2.png)
36+
37+
```python
38+
class Solution:
39+
def isHappy(self, n: int) -> bool:
40+
def get_next(n):
41+
sum = 0
42+
while n > 0:
43+
sum += (n % 10) ** 2
44+
n = n // 10
45+
return sum
46+
47+
hash_table = dict()
48+
while n not in hash_table:
49+
if n == 1:
50+
return True
51+
hash_table[n] = None
52+
n = get_next(n)
53+
54+
return False
55+
```
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# 242.有效的字母异位词
2+
## 题目
3+
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
4+
```python
5+
输入: s = "anagram", t = "nagaram"
6+
输出: true
7+
8+
输入: s = "rat", t = "car"
9+
输出: false
10+
```
11+
12+
## 解析
13+
* 如果两个字符串长度不相等直接返回False
14+
* 利用两个字典统计每个字符串中字符出现的次数
15+
* 如果两个字典相等,返回True
16+
17+
```python
18+
def isAnagram(s, t):
19+
if len(s) != len(t):
20+
return False
21+
22+
if s == t:
23+
return True
24+
25+
hash_s = {}
26+
hash_t = {}
27+
for i in range(len(s)):
28+
hash_s[s[i]] = hash_s.get(s[i], 0) + 1
29+
hash_t[t[i]] = hash_t.get(t[i], 0) + 1
30+
31+
return hash_t == hash_s
32+
```

leetcode_hash/赎金信.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# 383.赎金信
2+
## 题目
3+
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
4+
5+
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
6+
7+
```python
8+
输入:ransomNote = "a", magazine = "b"
9+
输出:false
10+
11+
输入:ransomNote = "aa", magazine = "aab"
12+
输出:true
13+
```
14+
15+
## 分析
16+
* 根据题目分析,ransom中字符出现的个数必须小于等于magazine中字符出现的次数
17+
* 分别统计ransom,magazine中字符出现的次数
18+
* 比较ransom,magazine每个字符出现的次数
19+
20+
```python
21+
def canConstruct(ransomNote, magazine):
22+
hash_1 = dict()
23+
hash_2 = dict()
24+
for char in ransomNote:
25+
hash_1[char] = hash_1.get(char, 0) + 1
26+
for char in magazine:
27+
hash_2[char] = hash_2.get(char, 0) + 1
28+
29+
for char, times in hash_1.items():
30+
if hash_2.get(char, 0) < times:
31+
return False
32+
return True
33+
```

pic/leetcode_hash/202_1.png

22.1 KB
Loading

0 commit comments

Comments
 (0)