算法与数据结构—LeetCode刷题笔记

一、动态规划

53 最大子序和

在这里插入图片描述

  • 典型的「动态规划」问题,掌握动态规划问题设计状态的技巧,并且需要知道如何推导状态转移方程;
  • 最后再去优化空间。

(1)双指针暴力解法

比较容易想到的是用“暴力解法”做,即穷举所有的子区间。思路虽然简单,但是写好暴力解法也不是一件容易的事情。

  • 使用双层循环,穷举所有的子区间;
  • 然后再对子区间内的所有元素求和;
  • 时间复杂度是立方级别的。
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        #类似双指针
        if len(nums) == 1: return int(nums[0])
        maxSum = nums[0]
        i = 0
        while i < len(nums):
            tmp = nums[i]
            for j in range(i + 1, len(nums)):
                if nums[j] + tmp < nums[j]:
                    i = j
                    maxSum = max(nums[j], maxSum)
                    break
                else:
                    tmp = nums[j] + tmp
                    maxSum = max(maxSum, tmp)
            if j == len(nums) - 1:
                break
        return maxSum

(2)动态规划
状态转移方程:
在这里插入图片描述

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0
        dp=[0]*len(nums)
        dp[0]=nums[0]
        for i in range(1,len(nums)):
            dp[i]=max(nums[i],dp[i-1]+nums[i])
        return max(dp)

300. 最长上升子序列

在这里插入图片描述

状态转移方程为:
在这里插入图片描述

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums:
            return 0
        dp = []
        for i in range(len(nums)):
            dp.append(1)
            for j in range(i):
                if nums[i] > nums[j]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)

70. 爬楼梯

在这里插入图片描述
dp[n] = dp[n-1]+dp[n-2]

class Solution:
    def climbStairs(self, n: int) -> int:
        if n <=2:
            return n
        dp = [0]*n
        dp[0] = 1
        dp[1] = 2
        for i in range(2,n):
            dp[i] = dp[i-1]+dp[i-2]
        return dp[n-1]    

class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        a = 1
        b = 2 
        for i in range(3,n+1):
            t = b
            b = a + b
            a = t
        return b

242. 有效的字母异位词

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 集合
        if len(s) != len(t):
            return False
        set1=set(s)
        for i in set1:
            if s.count(i) != t.count(i):
                return False
        return True
# 哈希表
class Solution():
    def isAnagram(self, s, t):
        # 哈希表
        if len(s) != len(t):
            return False
        count = {}
        for char in s:
            print(char)
            if char in count:
                count[char] += 1

            else:
                count[char] = 1
        print(count)
        for char in t:
            if char in count:
                count[char] -= 1
            else:
                return False
        for value in count.values():
            print(value)
            if value != 0:
                return False
        return True
if __name__=='__main__':
    # anagram,nagaram
    s,t=list(map(str,input().split(',')))
    print(s)
    print(t)
    print(Solution().isAnagram(s,t))

463. 岛屿的周长

在这里插入图片描述

class Solution:
    def islandPerimeter(self, grid: List[List[int]]) -> int:
        
        count = 0
        for i in range(len(grid)):
            for j in range(len(grid[i])):
                if grid[i][j] == 1:
                    if i + 1 >= len(grid) or grid[i+1][j] == 0:
                        count += 1
                    if i - 1 < 0 or grid[i-1][j] == 0:
                        count += 1
                    if j + 1 >= len(grid[i]) or grid[i][j+1] == 0:
                        count += 1
                    if j - 1 < 0 or grid[i][j-1] == 0:
                        count += 1
        return count

在这里插入图片描述

class Solution:
    # 哈希
    def longestPalindrome(self, s: str) -> int:
        count = {}
        for i in s:
            if i in count:
                count[i] += 1
            else:
                count[i] = 1
        number = 0
        odd = 0
        for i in count:
            if count[i] % 2 == 0:
                number += count[i]
            else:
                number += (count[i] - 1)
                odd = 1
        return int(number + odd) 
文章与视频资源多平台更新
微信公众号|知乎|B站|头条:AI研习图书馆

深度学习、大数据、IT编程知识与资源分享,欢迎关注,共同进步~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI研习图书馆

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值