当前位置: 首页 > news >正文

沈阳养老保险网站学校网站建设电话

沈阳养老保险网站,学校网站建设电话,建设银行河北省分行官方网站,WordPress手机端发表题目链接 文章目录 1. 思路讲解1.1 dp表的创建1.2 状态转移方程1.3 使用哈希表找到k1.4 初始化1.5 返回值1.6 该题坑爹的一点 2. 代码编写 1. 思路讲解 我们要知道以某个位置为结尾的子序列的数量,可以通过它的以上一位置的为结尾的子序列的数量得知,也…

题目链接

文章目录

  • 1. 思路讲解
    • 1.1 dp表的创建
    • 1.2 状态转移方程
    • 1.3 使用哈希表找到k
    • 1.4 初始化
    • 1.5 返回值
    • 1.6 该题坑爹的一点
  • 2. 代码编写

1. 思路讲解

我们要知道以某个位置为结尾的子序列的数量,可以通过它的以上一位置的为结尾的子序列的数量得知,也就是说,这是一个dp问题。

1.1 dp表的创建

dp问题我们需要创建dp表,如果我们单纯使用dp[i]来表示以 i 位置为结尾的子序列的数量是完全不够的。因为我们不知道以 i-1 位置为结尾的等差数列是怎样的,它的公差是几我们是不知道的。也就是说,我们不确定 i 位置的元素是否能跟到以 i - 1 位置为结尾的数列的后面。

但是,如果知道了数列的后两个元素,也就是知道了 i - 1 位置以及数列中上一个位置的元素,就能知道数列的公差了,也就能知道 i 位置的元素是否能跟到后面了,所以我们需要用两个元素来表示每个dp位置。

创建二维dp表,dp[i][j]表示以 i 位置的元素为数列倒数第二个元素,以 j 位置的元素为数列倒数第一个元素,为结尾的数列数量有多少。(我们人为规定i < j)

1.2 状态转移方程

nums[j] - nums[i]可以得到公差,再由 num[i] - 公差 可以得到上一项的值,记为 a,我们需要知道这个 a 值在nums中是否存在且是否在 i 位置的前面,两个条件都满足才符合题意。

记 a 在nums中的下标为k(至于怎么找到这个k下面会说),我们要找到以 i 和 j 位置为结尾的等差数列的个数,其实找到所有 k 和 i 位置元素结尾的等差数列的个数相加即可(a元素在nums中的位置不只一个,那么k可能就不只一个)。并且也需额外加上一个数列,就是 k,i ,j,本身所构成的等差数列。

那么状态转移方程就为:dp[i][j] += dp[k][i] + 1

1.3 使用哈希表找到k

我们写代码的时候,遍历所有 i 和 j 的组合,时间复杂度就已经到达 N^2 了,如果此时再在数组中去寻找 k ,那么时间复杂度就 N^3了,这大概率是会超时的。

我们可以在dp之前,使用哈希表去将<所有元素,数组下标>绑定在一起,放在哈希表中,这样我们得到了 a 之后,就可以使用哈希表很快地查找到 k 了。

1.4 初始化

刚开始,以 i,j 位置为结尾,只有两个元素,不符合题目中的等差数列,可以记为 0 ,所以我们初始化的时候将dp表中所有的值初始化为 0 即可。又因为,vector会默认初始化为0,所以我们不用手动初始化了。

1.5 返回值

我们要求的是所有的等差数列,所以我们要将所有符合题意的dp[i][j]都加起来然后返回。

1.6 该题坑爹的一点

虽然题目已经说了,返回值以及各个元素的值都在int范围内,但是我们求a的时候,a的值可能会超出int的范围从而出错,所以我们将a的类型要设置为long long。然后用a查找k用的是hash,所以hash的第一个类型也要为long long。

2. 代码编写

在这里插入图片描述

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();// 创建哈希表,便于很快地找到k// 因为k不只一个,所以用vector来存储unordered_map<long long, vector<int>> hash;for (int i = 0; i < n; i++) hash[nums[i]].push_back(i);// 创建二维dp表,第一维为数列的倒数第二个元素,第二维为数列的倒数第一个元素vector<vector<int>> dp(n, vector<int>(n));int ret = 0; // 所有数组的数量// i为nums第0个位置时,不管j为几,dp[0][j]都为0,因为只有两个元素// 所以从第1个位置开始填表即可,且i一定不为nums最后一个元素for (int i = 1; i < n - 1; ++i){// j从i+1开始,一直到最后一个位置,寻找符合题意的情况for (int j = i + 1; j < n; ++j){long long a = (long long)2*nums[i] - nums[j];if (hash.count(a)) // 看a是否存在于hash中{// 如果存在,遍历a对应的vectorfor (auto k : hash[a]){// k需要小于iif (k < i) dp[i][j] += dp[k][i] + 1;}} ret += dp[i][j];}}return ret;}
};
http://www.hyszgw.com/news/52549.html

相关文章:

  • 怎么区分用vs和dw做的网站外贸电子商务网站建设平台
  • 国外的网站服务商衡水建设网站公司
  • 做电影下载网站需要什么软件wordpress怎么增加语言包
  • 网页链接制作生成二维码seo营销工具
  • 网站建设合同编号专业建站提供商
  • html网站留言板代码保定徐水网站建设
  • 南京建设交易中心网站潍坊推广平台
  • 云南网站制作案例浙里建系统平台
  • 网站搭建排名优化代刷推广网站
  • 中国建设银行官网站电话做网站平台的注册什么商标
  • 无为县住房和城乡建设局网站合肥市有做网站的公司吗
  • 做详情页到那个网站找模特素材织梦网站字体
  • 厦门易尔通网站建设好吗如何做能放照片的网站
  • 网站开发获取本地ip导入表格数据做地图网站
  • 工体网站建设公司介绍公司的话简短精辟
  • 不收费推广网站有哪些注册网站查询系统
  • 营销型网站建设必备功能网站项目的介绍
  • 网站推广话术wap网站建设服务
  • 网站的空间蔚县住房和城乡规划建设局网站
  • 宁波网站建设服务公司电hua国外购物网站欣赏
  • 网站排名优化需要多久物流公司网站开发与淘宝对接 在淘宝卖家中心显示物流信息
  • 视频网站备案怎么做台州网站设计建设
  • 旅游网站建站目的做视频网站要注意什么
  • 制作单页网站多少钱wordpress 数据库大小
  • 青岛网站建设 推荐青岛博采网络dw做的网站如何使用
  • 建设网站公司哪家好网站内容是什么
  • app定制网站开发wordpress 显示图片
  • 做网站的语言有哪些公司注册资金实缴政策
  • 西安网站关键词优化品牌策划案例
  • 虚拟机中建设iis网站重庆食品商城网站设计