力扣hot100

06-02 1419阅读

一、53. 最大子数组和

力扣hot100

  • 思路1:前缀和。
  • 代码
    class Solution:
        def maxSubArray(self, nums: List[int]) -> int:
            if len(nums) == 1:
                return nums[0]
            preSum = [0] * (len(nums)+1)
            for idx, n in enumerate(nums):
                preSum[idx+1] = preSum[idx] + n
                
            res = -inf
            for idx, p in enumerate(preSum):
                for i in range(idx):
                    res = max(res, p-preSum[i])
            return res
    # 前缀和比较好写,但是上面复杂度太高,没法AK
    # 其实每次我们只需要减去最小的前缀和,维护一个最小的前缀和,就不需要多一层循环。优化如下
    class Solution:
        def maxSubArray(self, nums):
            if len(nums) == 1:
                return nums[0]
            res = -inf
            preSum = 0
            minPreSum = 0
            for n in nums:
                preSum += n
                res = max(res, preSum - minPreSum)
                minPreSum = min(minPreSum, preSum)
            return res
    
    • 思路2:dp
      • 定义dp[i],表示以nums[i]j结尾的最大子数组和。当来到第i个位置,有两种可能
        1. 以dp[i] = nums[i],单独成一个子数组
        2. dp[i] = dp[i-1] + nums[i],这种情况需要dp[i-1] >=0
      • 代码
        class Solution:
            def maxSubArray(self, nums):
                dp =[0] * len(nums)
                dp[0] = nums[0]
                for i in range(1, len(nums)):
                    dp[i] = max(dp[i-1], 0) + nums[i]
                return max(dp)
        

        二、56. 合并区间

        力扣hot100

        • 思路:先将intervals中的区间按起始排序。这样每个新来的区间就不用和已经确定好没要交集的区间比较了。
        • 代码
          class Solution:
              def merge(self, intervals: List[List[int]]) -> List[List[int]]:
                  intervals.sort(key=lambda p:p[0])  
                  res = []
                  for p in intervals:
                      if res and p[0]  None:
                  def reverse(i, j):
                      while i  
          
          • 代码2:使用python自带的reverse语法
                def rotate2(self, nums: List[int], k: int) -> None:
                	# python也有自带的reverse语法
                	n = len(nums)
                	k %= n
                	nums.reverse()
                	nums[:k] = reversed(nums[:k])
                	nums[k:] = reversed(nums[k:])
            

            四、238. 除自身以外数组的乘积

            力扣hot100

            • 思路:前后缀分解。维护一个pre[i]:表示0到i-1的乘积,suf[i]表示i+1到n-1的乘积。
            • 代码
              class Solution:
                  def productExceptSelf(self, nums: List[int]) -> List[int]:
                      n = len(nums)
                      pre = [1]*n
                      for i in range(1, n):
                          pre[i] = pre[i-1] * nums[i-1]
                      suf = [1]*n
                      for i in range(n-2, -1, -1):
                          suf[i] = suf[i+1] * nums[i+1]
                          
                      return [p * s for p, s in zip(pre, suf)]
              

              五、41. 缺失的第一个正数

              力扣hot100

              • 思路:将每个数字放到自己值对应的索引上
              • 代码:
                class Solution:
                    def firstMissingPositive(self, nums: List[int]) -> int:
                        n = len(nums)
                        for i in range(n):
                        	# 当前数字大小在列表范围内且没有放到对应的索引位置上。
                            while 1 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码