大一军训结束后的第一天,我开始接受ai studio的招新考核,而考核内容是一次Datawhale的组队学习。凭借不到一个月的Python基础,我将接触Leetcode这个代码在线评测平台,不断刷题以练习编程技能并提高算法能力。这一系列的学习笔记将会在学习期间随着我不断深入的认知而持续修正和更新。
给定两个在-100~100区间内的整数 num1
和 num2,
返回这两个整数的和。
class Solution(object):
def sum(self, num1, num2):
num = num1 + num2
return num
时间复杂度与空间复杂度都是O(1)。
给定一个长度为 n
的整数数组 nums,
构建一个长度为 2 * n
的答案数组 ans
,答案数组下标从 0
开始计数 ,对于所有 0 <= i < n
的 i
,满足下述所有要求:
ans[i] == nums[i]
ans[i + n] == nums[i]
class Solution(object):
def getConcatenation(self, nums):
nums.extend(nums)
return nums
这里还有一种更简洁但更耗时的写法。
class Solution(object):
def getConcatenation(self, nums):
return nums+nums
给定一个字符串 jewels
代表石头中宝石的类型,再给定一个字符串 stones
代表你拥有的石头。stones
中每个字符代表了一种你拥有的石头的类型,计算出拥有的石头中有多少是宝石。
jewels
和 stones
仅由英文字母组成,jewels
中的所有字符都是唯一的,字母区分大小写,因此 a
和 A
是不同类型的石头。
class Solution(object):
def numJewelsInStones(self, jewels, stones):
n = 0
for i in jewels:
for j in stones:
if i == j:
n += 1
return n
这里我使用了双层嵌套循环结构,标答的写法更简洁,采用了sum()函数统计,但牺牲了效率。
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
# 上面注释了参数可赋的数据类型以及返回值的数据类型
return sum(s in jewels for s in stones)
两种写法的思路一致,时间复杂度O(len(jewels
) * len(stones
)),空间复杂度O(1),可见该算法运行时间长但占用内存少。若采用哈希集合可牺牲空间复杂度换取时间复杂度,但是实现较为复杂,这里略去。
给定一个数组 nums,
返回数组 nums
的动态和(数组前 i
项元素和构成的数组,计算公式为 runningSum[i] = sum(nums[0] … nums[i])
)
class Solution(object):
def runningSum(self, nums):
lst = []
for n in range(len(nums)-1,-1,-1):
j = sum( nums[i] for i in range(len(nums)-n))
lst.append(j)
return lst
我的思路比较暴力,动态和的每一个元素都从头加算,代价是双层嵌套循环。但是标答的思路采用了递归思想,并采用索引有序修改原数组的各个元素,简洁优雅,有效节省了用时。
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
for i in range(1, len(nums)):
nums[i] += nums[i - 1]
return nums
两种方法的空间复杂度均为O(1),但时间复杂度分别是O(len(nums)**2)和O(len(nums))。
给定一个字符串 s,
将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
class Solution(object):
def toLowerCase(self, s):
return s.lower()
时间复杂度O(len(s
)),空间复杂度O(1)。
给定一个 m x n
的整数网格 accounts
,其中 accounts[i][j]
是第 i
位客户在第 j
家银行托管的资产数量,返回最富有客户所拥有的资产总量(在各家银行托管的资产数量之和)。
class Solution(object):
def maximumWealth(self, accounts):
i = 0
s = sum(accounts[i])
# sum()函数可直接对数组求和
while i < len(accounts)-1:
if s <= sum(accounts[i+1]):
s = sum(accounts[i+1])
i += 1
return s
第一次遇到二维数组问题,但巧用前面的递归思想,很好解。但标答直接用max函数秒杀了。时间复杂度O(len(m) * len(n))一样,虽然我的解法的用时会小一点。
class Solution:
def maximumWealth(self, accounts):
return max(map(sum, accounts))
程序:算法和数据结构的具体实现
数据结构:数据的计算机表示和相应的一组操作。即数据的组织结构,用来组织、存储数据,以提高计算机硬件的利用率。
逻辑结构:数据元素之间的相互关系
物理结构:数据的逻辑结构在计算机中的存储方式。
前者简单易理解,占用内存少,但需要事先分配一片地址连续的存储单元,对一些操作的时间效率较低;后者时间效率高,可临时申请存储空间,不会造成空间浪费,但指针也要占用存储空间,空间开销大。
算法:解决特定问题求解步骤的准确而完整的描述,在计算机中表现为一系列指令的集合,代表着用系统的方法描述解决问题的策略机制。即解决问题的方法或者过程。
它可以用 自然语言、编程语言(Python、C、C++、Java 等)描述,也可以用 伪代码、流程图 来表示。
基本特性:
目标: