数组
实现一个支持动态扩容的数组
参考:python实现动态数组
1 | # coding:utf-8 |
实现一个大小固定的有序数组,支持动态增删改操作
需要注意数组始终有序,在下方代码中默认升序
1 | # coding:utf-8 |
实现两个有序数组合并为一个有序数组
方法一
return sorted(list1+list2)
,先合并再排序
方法二
使用一种比较朴素的方法来合并:遍历2个数组,将较小的数插入list
1 | # coding:utf-8 |
哈希表
学习哈希表思想,并完成leetcode上的两数之和(1)及Happy Number(202)!(要求全部用哈希思想实现!)
哈希表可简单理解为k-v,在python中,哈希表可用dict表示
leetcode-1-两数之和
代码见:leetcode-1-两数之和 中”方法二”,使用dict记录当前元素下标和匹配的值
LeetCode-202-快乐数Happy Number
使用dict记录求过的数
1 | class Solution(object): |
对应的 LeetCode 练习题
Three Sum(求三数之和)
英文版:https://leetcode.com/problems/3sum/
中文版:https://leetcode-cn.com/problems/3sum/
代码见:leetcode-15-三数之和
Majority Element(求众数)
英文版:https://leetcode.com/problems/majority-element/
中文版:https://leetcode-cn.com/problems/majority-element/
使用dict记录{当前num:出现次数}
1 | class Solution(object): |
或者调用Counter
1 | class Solution(object): |
Missing Positive(求缺失的第一个正数)
英文版:https://leetcode.com/problems/first-missing-positive/
中文版:https://leetcode-cn.com/problems/first-missing-positive/
思路:使用桶,大小为len(nums),负数可以丢弃,大于len(nums)的数也可以丢弃。遍历一遍后nums后,遍历桶,返回第一个空位index
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums) + 1 # 0位置无效,多设置一位,使用index更直观
bucket = [0] * n
for e in nums:
# print(bucket)
if e > 0 and e < n: # 求的是第一个缺失的正整数,>n的数可以丢弃
bucket[e] = e # 非0值,设置为e方便debug
# print(bucket)
for i in range(1, n):
if bucket[i] == 0:
return i
return n
s = Solution()
print(s.firstMissingPositive([1, 2, 0])) # 3
print(s.firstMissingPositive([1, 2])) # 3
print(s.firstMissingPositive([3, 4, -1, 1])) # 2
print(s.firstMissingPositive([7, 8, 9, 11, 12])) # 1
链表
实现单链表、循环链表、双向链表,支持增删操作
1 | # coding: utf-8 |
实现单链表反转
1 | # coding: utf-8 |
实现两个有序的链表合并为一个有序链表
1 | def Merge(self, pHead1, pHead2): |
实现求链表的中间结点
1 | # coding: utf-8 |
对应的 LeetCode 练习题
Linked List Cycle I(环形链表)
英文版:https://leetcode.com/problems/linked-list-cycle/
中文版:https://leetcode-cn.com/problems/linked-list-cycle/