LeetCode75刷题记录

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. 同构字符串

image.png

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. 判断一个字符串是否是另一个字符串的子串

没做出来
题解:双指针!

image.png

day3

5.合并两个升序 链表!

自己没做出来,不了解链表在python中的操作

  • 链表初始化l = ListNode(None)l =ListNone(-1)
  • 通常要保留下头节点lhead = l
  • 链表当前节点的取值l.val
  • 链表下一个节点信息 l.next
  • 链表指针后移l=l.next
    day3 5 合并升序链表

题解1:迭代


image.png

题解2: 递归


image.png

6. 反转链表

双指针!

image.png

递归!: head.next == None是找到了尾结点的标志,加head==None这一判断条件是因为head本身可能是空链表

image.png

day4:

7.返回链表的中间结点

image.png

try1: 遍历两次 O(n)


image.png

题解:快慢指针!(liweiwei1419)

  • 使用两个指针变量,刚开始都位于链表的第 1 个结点,一个永远一次只走 1 步,一个永远一次只走 2 步,一个在前,一个在后,同时走。这样当快指针走完的时候,慢指针就来到了链表的中间位置。
  • 思想是:快慢指针的前进方向相同,且它们步伐的「差」是恒定的,根据这种确定性去解决链表中的一些问题。


    image.png

8. 环形链表II 找链表中是否有环,有的话返回环开始的结点

image.png

try1: 用哈希表记录出现过的结点


image.png

day5

121. 买卖股票的最佳时机,只求最大利润

image.png

题解1: 遍历一次,每次更新最低价格,并求今天卖出可以得到的利润,不断更新最大利润


409.最长回文串

image.png

题解1:


image.png

你可能感兴趣的:(LeetCode75刷题记录)