LeetCode解题 Day10

446. Arithmetic Slices II - Subsequence

https://leetcode.com/problems/arithmetic-slices-ii-subsequence/


  • 先卡位,今天打疫苗,开始发烧了
  • 9/11补上

题目解释

你会得到一组阵列,请从阵列中找出所有可以组成的等差数列,但是有以下条件:

  1. 等差数列的要包含至少3个数字
  2. 必须按照阵列数字原有的顺序找出等差数列

example

https://i.imgur.com/w9f5wgG.png


解法

这题我觉得很难,看着别人的答案只觉得,能想到这个解法的不是人吧!

所以我尽量用浅显易懂的方式说明别人的解法

先看看程序码吧

程序码

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        
        dp = [defaultdict(int) for i in range(len(nums))]
        ans = 0
        
        for i in range(len(nums)):
            for j in range(i):
                difference = nums[i] - nums[j]
                dp[i][difference] += dp[j][difference] + 1
                ans += dp[j][difference]
        return ans
                

这题要用动态规划(dp)来解,而dp要记录的东西请看下图

https://i.imgur.com/t8ufAz7.png

表格的y 方向是阵列的所有数字,表格的x 方向纪录数字之间会出现的差

而表格内的数字则代表到目前为止,有包含该数字的等差数列有几个

例如:
https://i.imgur.com/VAI2Tc9.png

上图中:
(阵列4,差2)的数字就代表数字4在目前组出等差为2的数列出现1次 --> [2,4]
(阵列6,差2)的数字就代表数字6在目前组出等差为2的数列出现2次 --> [2,4,6]、[4,6]
(阵列8,差2)的数字就代表数字8在目前组出等差为2的数列出现3次 --> [2,4,6,8]、[4,6,8]、[6,8]

这些步骤就是这段程序在做的

difference = nums[i] - nums[j]
dp[i][difference] += dp[j][difference] + 1

而我们要回传有几组符合条件的,则靠这行程序去纪录:

ans += dp[j][difference]

这行的意思我们再借用上图来解释:

(阵列6,差2)的数字就代表数字6在目前组出等差为2的数列出现2次 --> [2,4,6]、[4,6]
(阵列8,差2)的数字就代表数字8在目前组出等差为2的数列出现3次 --> [2,4,6,8]、[4,6,8]、[6,8]

当我们再计算(阵列8,差2)的数字是多少时,这里ans 会记录(阵列6,差2)里的2

这代表数字8让*[2,4,6]、[4,6]* 变成*[2,4,6,8]、[4,6,8]*,所以我们纪录(阵列6,差2)里的2


闲聊

还在发烧中/images/emoticon/emoticon06.gif


<<:  防止自动锁屏

>>:  Day10-CallBack

一键更新HTTPS凭证 - Automation Accounts

说明 在前篇介绍建立可提供 Let’s Encrypt 申请凭证的 Application Gate...

Day 12:vim 配色方案

俗话说人要衣装,佛要金装,我们的 vim 也得要有漂亮的外观。今天就让我们来看看如何调教调整 vim...

nestJS-MicroService-gRpc 处理更新null情况

前情提要&遭遇问题 nestJs 是一个以express为基础的後端框架,该框架可以选择gRPC实...

Python 做自动化编译 相关指令汇整

有些公司因为历史原因 在Build react,vue,npm等相关专案 需经过 前置的处理作业 这...

Day14-Kubernetes 那些事 - Deployment 与 ReplicaSet(二)

前言 昨天的文章介绍了 Deployment 以及 ReplicaSet 的基本介绍後,接下来要介绍...