LeetCode第九天(53、最大子数组和,5、最长回文子串 Medium)

断了两天,续上!

目录

一、题目:

二、思路:

1、我的解题思路:

2、动态规划学习

3、精简化步骤:

三、代码部分:


最大子数组和:

一、题目:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 
输入:nums = [1]
输出:1

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

二、思路:

1、我的解题思路:

化大问题为小问题,通过局部最优解来推出全局最优解。

定义最佳状态数组: dp = [],dp[i]表示到第个元素为止,下标连续的子数组的和的最大值。

定义下标连续的子数组的和的最大值: Maxdp,即存放最终答案。因为最大值不一定是dp最后一项

核心思想就在于语句:max(dp[i-1] + nums[i], nums[i])

这里使用max的原因是如果之前的加上当前的比当前的还小,那就保留当前的即可,否则就用之前+当前标识标识考虑当前情况下的最大即可。

2、动态规划学习

告别动态规划,连刷40道动规算法题,我总结了动规的套路_Hollis Chuang的博客-CSDN博客

3、精简化步骤:

解决这类题目的步骤:

1、定义数组元素的含义。

在本题中使用dp[]数组来存放下标为i的最大子数组和,Maxdp存放到现在为止最大子数组和

2、找出数组元素间的关系。

dp[i]=max(dp[i-1]+nums[i],nums[i])

3、找出初始条件。

dp[0]=-2

dp[1]=1

三、代码部分:

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp=[nums[0]] 
        Maxdp=dp[0]
        for i in range(1,len(nums)):
            dp.append(max(dp[i-1]+nums[i],nums[i]))
            if dp[i]>Maxdp:
                Maxdp=dp[i]
        return Maxdp

最长回文子串    Medium

一、题目:

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

二、思路:

正反读着相同,即对称,所以先能想到中心扩散法:

找一个数字往两边扩散。

拿acdbbdaa举例子:

 图中有一处不当,(第二行,往左扩散,如果左边和当前值不同,仍然还是left=right=3,len=1)

我们在这个过程中需要的变量有,left,right,cur记录左右以及中心位置,len记录当前回文串长度,maxlen记录 现在所有的最长回文子串的长度,以及用now[]记录当前保存的最长回文子串.

在实际操作过程中我们把他分为最终字符串长度为奇数和为偶数两种方法来讨论

可以看一看字符串切片方法:

python 字符串切片_python字符串切片_Choosen_Me的博客-CSDN博客

再系统的复习一下range 函数:

Python中的range函数_python range_Python和数据分析的博客-CSDN博客

三、代码:

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        maxlen=0
        now=''
        for i in range(0,len(s)):
            left=right=i
            while (left>=0 and right<len(s) and s[left]==s[right]):
                if right-left+1>maxlen:
                    maxlen=right-left+1
                    now=s[left:right+1]
                left-=1
                right+=1
            left,right=i,i+1
            while (left>=0 and right<len(s) and s[left]==s[right]):
                if right-left+1>maxlen:
                    maxlen=right-left+1
                    now=s[left:right+1]
                left-=1
                right+=1
        return now

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值