Level1 4/15
day1 2022-07-23
1.1480 一维数组的动态和,求一维数组各个位置的累加和
自己的解法:
每次 这其实是动态规划的思想,但我并没有意识到;
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
result = [nums[0]]
for i in range(1,len(nums)):
result.append(result[i-1]+nums[I])
return result
题解:
使用前一个「动态和」来计算得到「当前动态和」,此题被化为一个简单的动态规划问题
题解
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
dp = [0] * len(nums)
dp[0] = nums[0]
for i in range(1, len(nums)):
dp[i] = dp[i - 1] + nums[i]
return dp
作者:jyd
链接:https://leetcode.cn/problems/running-sum-of-1d-array/solution/by-jyd-hz70/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
此外,我的写法和题解其实一样,并且都没有考虑到数组为空的情况,会报下标超出的错误,
改进的解法,如果数组为空就不会进入循环了:
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
result = []
for i in range(len(nums)):
if i == 0: #进入循环后说明数组不为空
result.append(nums[I])
else:
result.append(result[i-1]+nums[I])
return result
2. 724 寻找数组的中心下标,使得其左右的和相等
自己的解法:
每次都要重新计算索引位置的左右两边的和,
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
if len(nums) == 0 : # 长度为0的情况
return -1
elif len(nums) == 1 : # 长度为1必返回0
return 0
for i in range(len(nums)-1):
if sum(nums[:i]) == sum(nums[i+1:]):
return I
if sum(nums[:-1]) == 0 :
return len(nums)-1
return -1
题解:
以中心坐标其左右的和 进行遍历,
返回值只有两种可能:1⃣️ -1 2⃣️ 索引值 ,不做多余的判断
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
"""
左右的和 不包含索引所在位置的值
"""
sum_left, sum_right = 0, sum(nums) # 初始化 中心坐标为-1
for i in range(len(nums)):
# 中心坐标为0时,左边和依然为0,右边和要去掉nums[0]
sum_right -= nums[I]
if sum_left == sum_right:
return i
else:
sum_left += nums[I]
return -1
day2
3. 同构字符串
try1: 题目前提两字符串长度相同,所以分别用字典记录字符第一次出现的索引以此为它们的编号,然后用列表分别记录两个字符的编号是否相同。
时间复杂度
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
dic1, dic2 = {},{}
note1, note2 = [],[]
for i in range(len(s)):
if s[i] not in dic1:
dic1[s[i]] = I
note1.append(dic1[s[I]])
if t[i] not in dic2:
dic2[t[i]] = I
note2.append(dic2[t[I]])
if note1 == note2:
return True
else:
return False
题解:
记录映射关系,如果发现与之前已经存在的映射关系矛盾的新映射出现,则不符合。
我写的
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
dic1, dic2 = {},{}
for i in range(len(s)):
if s[i] not in dic1 and t[i] not in dic2:
dic1[s[i]] = t[I]
dic2[t[i]] = s[I]
elif s[i] in dic1:
if dic1[s[i]] != t[i] :
return False
elif t[i] in dic2:
if dic2[t[i]] != s[i] :
return False
return True
题解写的:时空复杂度是相同的,但是比我写的语法简练
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
dic1, dic2 = {},{}
for a,b in zip(s,t):
if (a in dic1 and dic1[a] != b)\
or (b in dic2 and dic2[b] != a) :
return False
else:
dic1[a],dic2[b] = b,a
return True
4. 判断一个字符串是否是另一个字符串的子串
没做出来
题解:双指针!
day3
5.合并两个升序 链表!
自己没做出来,不了解链表在python中的操作
- 链表初始化
l = ListNode(None)
或l =ListNone(-1)
- 通常要保留下头节点
lhead = l
- 链表当前节点的取值
l.val
- 链表下一个节点信息
l.next
- 链表指针后移
l=l.next
题解1:迭代
题解2: 递归
6. 反转链表
双指针!
递归!: head.next == None
是找到了尾结点的标志,加head==None
这一判断条件是因为head本身可能是空链表
day4:
7.返回链表的中间结点
try1: 遍历两次 O(n)
题解:快慢指针!(liweiwei1419)
- 使用两个指针变量,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步,一个在前,一个在后,同时走。这样当快指针走完的时候,慢指针就来到了链表的中间位置。
-
思想是:快慢指针的前进方向相同,且它们步伐的「差」是恒定的,根据这种确定性去解决链表中的一些问题。
8. 环形链表II 找链表中是否有环,有的话返回环开始的结点
try1: 用哈希表记录出现过的结点
day5
121. 买卖股票的最佳时机,只求最大利润
题解1: 遍历一次,每次更新最低价格,并求今天卖出可以得到的利润,不断更新最大利润
409.最长回文串
题解1: