大模型实在是太火了,所以也尝试学习一下,会将自己的学习路径发在这里,仅供参考吧。
Day 1-激活基础
很多东西以前都学过,比如最重要的python语言啥的,基础必须得过一下,如果像我一样很久都没接触过的了,建议随便找个公开课速成一下,不然算法题都没法下手😳。我看的是这个up主,很快就可以复习完了:20分钟学完一遍python基础 - 哔哩哔哩
为了防止拖延症,我每天会将最重要的算法题放在第一个。刷了一些攻略,发现很多人都推荐在刷算法题之前,先去过一遍这个up主的基础算法精讲系列,时间也不是很长,所以我也看了一下:两数之和 三数之和【基础算法精讲 01】_哔哩哔哩_bilibili
1.hot100-进度5/100
1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
第一种解法:双指针
在排序时带上索引下标,即排序的对象是元组(num, index)的数组。
时间复杂度:O(nlogn):排序占用
空间复杂度:O(n)
python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_index_list = [(num,i) for i,num in enumerate(nums)]
num_index_list.sort()
left = 0
right = len(nums) - 1
while left < right:
sum = num_index_list[left][0] + num_index_list[right][0]
if sum > target:
right -= 1
if sum < target:
left +=1
if sum == target:
return [num_index_list[left][1],num_index_list[right][1]]
第二种解法:MAP
使用index() 查找。
Map中,key是num,value是数组index。- 遍历数组,如果
target - num在Map中,返回。反之,将num加入Map中。
时间复杂度:O(n):只遍历一遍
空间复杂度:O(n):字典存了 n 个元素
python
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
num_index_list = {}
for i,num in enumerate(nums):
if target - num in num_index_list :
return [num_index_list[target - num],i]
num_index_list[num] = i #把当前数字和它的下标存进字典,给后面的数字用来配对
49. 字母异位词分组
这道题是经典的哈希表分组问题,核心是找到「字母异位词的统一特征」,用这个特征作为哈希表的键,把相同特征的词分到同一组。
第一种解法:排序法
把字符串的字符按字典序排序,异位词排序后结果完全一致。
时间复杂度:O (n*k logk),n 是字符串数量,k 是字符串最大长度
空间复杂度:O(nk)
python
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
anagram_dict = defaultdict(list)
for s in strs:
key = ''.join(sorted(s))
anagram_dict[key].append(s)
return list(anagram_dict.values())
第二种解法:计数法
统计每个字符出现的次数,用「次数数组 / 元组」作为标识。例:eat → (1,0,0,...1,0,...1,...)(a:1, e:1, t:1,其余 0)
时间复杂度:O (n*k),n 是字符串数量,k 是字符串最大长度
空间复杂度:O(n*k)
当字符串很长时,排序的时间开销会变大,用字符计数可以优化:
python
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
dic = defaultdict(list)
for s in strs:
count = [0] * 26
for c in s:
count[ord(c)-ord('a')] += 1
key = tuple(count)
dic[key].append(s)
return list(dic.values())
128.最长连续序列
核心思路:
- 用 集合(Set)存储数组元素,实现 O (1) 时间的存在性判断
- 只从序列的起点 开始遍历:如果一个数
x的前一个数x-1不在集合中,说明x是某个连续序列的起点 - 从起点
x开始,依次检查x+1, x+2, ...是否在集合中,统计当前序列长度 - 最终取所有序列长度的最大值
时间复杂度:O(n)
空间复杂度:O(n):额外开了一个哈希集合 num_set
python
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
num_set = set(nums)
max_len = 0
for num in num_set:
if num -1 not in num_set:
current_num = num
current_len = 1
while current_num + 1 in num_set:
current_num += 1
current_len += 1
max_len = max(max_len,current_len)
return max_len
283. 移动零
使用双指针:
- 使用一个指针
left指向当前应该放置非零元素的位置 - 遍历数组,遇到非零元素就将其放到
left位置,然后left++ - 遍历结束后,将
left之后的所有位置置为 0
时间复杂度:O(n),其中 n 是数组的长度
空间复杂度:O(1),只需要常数的额外空间
python
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
left = 0
for right in range(len(nums)):
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
return nums
11. 盛最多水的容器
这道题灵神讲过,思路不难,所以很快就做出来了。
双指针(对撞指针)解法,时间复杂度 O(n) ,空间复杂度 O(1)
python
class Solution:
def maxArea(self, height: List[int]) -> int:
max_water = 0
left = 0
right = len(height)-1
while left < right:
if height[left] <= height[right]:
water = height[left] * (right - left)
max_water = max(max_water,water)
left += 1
else:
water = height[right] * (right - left)
max_water = max(max_water,water)
right -=1
return max_water
2.准备工作
Python环境,还有VS Code,Git,WSL2 ,PyCharm 这些以前也都用过,所以配置环境部分都直接跳过了。
但是没想到Docker Desktop卡了我那么久!以前在C盘下载过,但是卸载不干净导致没法安装,感谢这篇帖子的博主分享才解决问题:解决Docker Desktop安装报错Component Docker.Installer.EnableFeaturesAction failed: 在 Docker.Installer.In-CSDN博客

3.git同步学习内容
git命令集面试也常考,我一般都是AI指导的,所以这个得单独学一下,比如:
- git init
- git status
- git add .
- git commit -m "xxx"
- git remote -v
- git remote add origin 仓库地址
- git pull
- git push
详细命令行可以参考这两篇帖子查漏补缺:Git 常用命令大全,Git 常用基本命令使用详细大全_git命令行-CSDN博客
这里建议根据自己需求整理一份git面试笔记,多搜集资料。
最后顺便练习一下git指令,将今日份学习笔记上传至github。