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

微信订阅号做微网站吗长沙网站制作策划

微信订阅号做微网站吗,长沙网站制作策划,泉州晋江疫情,北京平面设计公司名称前言 先讲讲我对于这个问题的理解吧 当谈到解决子数组问题时,动态规划(DP)是一个强大的工具,它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想,它通过将问题分解成更小的子问题并以一种递归的方式解决它们,然后利用这些…

前言

先讲讲我对于这个问题的理解吧

当谈到解决子数组问题时,动态规划(DP)是一个强大的工具,它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想,它通过将问题分解成更小的子问题并以一种递归的方式解决它们,然后利用这些解决方案来构建原始问题的解。在动态规划中,我们经常会遇到两种状态:一种是单独成一段,另一种是以 i 结尾的子数组。

通过枚举和动态规划,我们可以有效地解决子数组问题。枚举法需要考虑所有可能的子数组组合,然后比较它们以找到最优解。这种方法通常需要较多的时间和空间,因为它需要枚举所有可能性。而动态规划则更加智能化,它通过保存历史记录来避免不必要的重复计算。这样,下次遍历时,我们可以利用之前的计算结果,从而大大提高了效率。

动态规划的一个常见技巧是前缀和,它可以帮助我们快速求出数组中任意子数组的和。前缀和的核心思想是将原始数组中每个位置的值累加起来,形成一个新的数组,然后利用这个新数组来快速计算子数组的和。这种方法在处理求子数组和的问题时非常实用,因为它将复杂度降低到了单一状态的动态规划。

另外,预处理也是动态规划中常用的技巧之一。通过将经常使用的数据存储起来,我们可以在需要时快速获取,从而减少计算时间。预处理的思想是在问题出现之前就对数据进行处理,以便在需要时能够迅速获取所需的信息。

综上所述,动态规划是一种强大的解决子数组问题的方法,通过合理利用枚举、动态规划、前缀和和预处理等技巧,我们可以高效地解决各种复杂的算法挑战,为问题提供简单明了的解决方案。

这是我记得笔记 

 

我准备了五道例题都是这些解决方案

1.求最大子数组的和

. - 力扣(LeetCode)

思路分析:这一题主要是使用动态规划,也可以使用前缀和,动态规划也是求子数组的普遍思路,有两种状态,1自己组成子数组 和 前面的组成子数组,所以状态转移方程也就是Max(nums[i],dp[i - 1] + nums[i])

 代码实现

  public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n + 1];//以i位置为结尾的最大子数组和 (多状态 前面i - 1的子数组要  和 不要)// 初始化 (因为存在负数)dp[0] = -0x3f3f3f3f;//前面子数组都是以i - 1位置为结尾 或者 i位置自己构成一个数组for (int i = 1; i <= nums.length; i++) {dp[i] = Math.max(nums[i - 1], dp[i - 1] + nums[i - 1]);}int max = -0x3f3f3f3f;for (int i = 0; i < dp.length; i++) {max = Math.max(dp[i], max);}return max;}

2.求最大环形子数组

. - 力扣(LeetCode)

思路分析:

中间的是连续的所以求内部最小子数组和就好了, 或者中间成最大子数组和
//f[]表示以i位置为结尾的所有子数组中的最大值  //g[]表示以i位置为结尾的所有子数组中的最小值
//g[]就是为了处理边界。他通过计算中间部分的最小值来结算环的最大值

public int maxSubarraySumCircular(int[] nums) {int sum = 0;//用来处理最小值int n = nums.length;//1.状态表示int[] f = new int[n + 1],g = new int[n + 1];//2.状态转移方程    自己组成子数组  和  自己加上以 i-1位置结尾 的最大子数组//3.初始化 = 0 即可for (int i = 1; i <= n; i++) {f[i] = Math.max(f[i - 1] + nums[i - 1], nums[i - 1]);g[i] = Math.min(g[i - 1] + nums[i - 1], nums[i - 1]);sum += nums[i - 1];}int maxF = -0x3f3f3f3f;//统计结果int minG = 0x3f3f3f3f;//统计结果//可以和上面统一合并,一个循环就够了for (int i = 1; i <= n; i++) {maxF = Math.max(maxF,f[i]);minG = Math.min(minG,g[i]);}//为了防止全是负数返回0,所以sum - minG要和0做判断//因为  -8 - (-8) = 0;全是负数sum = -8 minG = -8 所以要返回maxFreturn Math.max(maxF,sum - minG == 0 ? maxF : sum - minG);}

3.和为k的子数组个数 

. - 力扣(LeetCode)

 思路分析:

//解法 动态规划  +  hash表   k == pre[i](i位置的前缀和) - pre[j - 1] //此时 [j,i]的子数组为k
 public int subarraySum(int[] nums, int k) {int count = 0;//统计出现了多少次int n = nums.length;HashMap < Integer, Integer > hash = new HashMap<>();//当词典使用,存储所有前缀和hash.put(0,1);//记录0出现了1次,防止前缀和单独构成答案//1.状态表示   以i位置为结尾的区间和int[] pre = new int[n + 1];//2.状态转移方程  pre[i] = pre[i - 1] + nums[i]//3.初始化  防止j - 1 越界 pre[0] = 0for (int i = 1; i <= n; i++) {pre[i] = pre[i - 1] + nums[i - 1];//下标映射,因为我的pre[0]是虚拟节点if (hash.containsKey(pre[i] - k)){count += hash.get(pre[i] - k);}hash.put(pre[i],hash.getOrDefault(pre[i],0) + 1);//键为前缀和的值 ,值为出现的次数}return count;}

 滚动数组优化形成前缀和

//因为上述我们只使用了,pre[i - 1] 和 pre[i] 这两种状态,所以可以使用滚动数组进行优化,设置两个变量即可//也就是我们熟知的前缀和public int subarraySum1(int[] nums, int k) {int count = 0;//统计出现了多少次int n = nums.length;HashMap < Integer, Integer > hash = new HashMap<>();//当词典使用,存储所有前缀和int pre = 0;hash.put(0,1);//记录0出现了1次,防止前缀和单独构成答案for (int i = 0; i < n; i++) {pre += nums[i];if (hash.containsKey(pre - k)){count += hash.get(pre - k);}hash.put(pre,hash.getOrDefault(pre,0) + 1);//键为前缀和的值 ,值为出现的次数}return count;}

4.乘积为k的最大子数组

 

. - 力扣(LeetCode)

思路分析:注释都有明确标注状态表示和转移方程

 public int maxProduct(int[] nums) {int n = nums.length;//1.定义状态表示int[] f = new int[n + 1];//以i位置为结尾  所有子数组中 乘积的最大值   遇到正数我要你int[] g = new int[n + 1];//以i位置为结尾  所有子数组中 乘积的最小值   遇到负数我要你//2.状态转移方程  遇到正数我要最大值(f[i - 1])    遇到负数我要最小值(g[i - 1])//3.初始化  防止i - 1越界但不可保存0,因为初始化的初衷就是保证后续的位置不受影响f[0] = g[0] = 1;//注意多次赋值是从右往左进行的int ret = -0x3f3f3f3f;for (int i = 1; i <= n; i++) {if (nums[i - 1] > 0){f[i] = Math.max(f[i - 1] * nums[i - 1],nums[i - 1]);g[i] = Math.min(g[i - 1] * nums[i - 1],nums[i - 1]);}else {f[i] = Math.max(g[i - 1] * nums[i - 1],nums[i - 1]);g[i] = Math.min(f[i - 1] * nums[i - 1],nums[i - 1]);}ret = Math.max(ret,f[i]);}return ret;}

5.乘积为正数的最长子数组长度

. - 力扣(LeetCode)

 public int getMaxLen(int[] nums) {int n = nums.length;int ret = 0;//统计//1.状态表示int[] f = new int[n + 1];//以i位置为结尾中的 所有子数组中的 乘积为正数的最大长度int[] g = new int[n + 1];//以i位置为结尾中的 所有子数组中的 乘积为负数的最大长度//2.状态转移方程  f[i]如果i位置为正数为 f[i - 1] + 1    负数 g[i - 1] + 1//              g[i]同理正数g[i - 1] + 1   负数 f[i - 1] + 1//3.初始化 默认长度为0不影响后续结果for (int i = 1; i <= n; i++) {if (nums[i - 1] > 0){f[i] = f[i - 1] + 1;//当最后一个元素为正数的时候,并且g[i - 1] = 0表示前面没有负数,所以不可能组成负数g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1;}else if (nums[i - 1] < 0){//当最后一个元素为负数的时候,并且g[i - 1] = 0表示前面没有负数,所以不可能组成正数f[i] = g[i - 1] == 0 ? 0 : g[i - 1]  + 1;g[i] = f[i - 1] + 1;}else {//处理为0的情况f[i] = 0;g[i] = 0;}ret = Math.max(ret,f[i]);}return ret;}

总结

当解决子数组问题时,动态规划是一个强大而智能的工具。通过将问题分解成更小的子问题并以递归的方式解决它们,动态规划可以高效地找到原始问题的解。在动态规划中,我们常常会遇到两种状态:一种是单独成一段,另一种是以 i 结尾的子数组。

枚举和动态规划是解决子数组问题的两种主要方法。枚举法需要考虑所有可能的子数组组合,然后比较它们以找到最优解。而动态规划则通过保存历史记录来避免不必要的重复计算,从而提高效率。

在动态规划中,常用的技巧包括前缀和和预处理。前缀和可以帮助我们快速求出数组中任意子数组的和,而预处理则可以在问题出现之前就对数据进行处理,以提高计算效率。

综上所述,动态规划是解决子数组问题的一种强大工具,通过合理利用枚举、动态规划、前缀和和预处理等技巧,我们可以高效地解决各种复杂的算法挑战,为问题提供简单明了的解决方案。


文章转载自:
http://vibrion.hmxb.cn
http://jeopardously.hmxb.cn
http://demagnetization.hmxb.cn
http://batuque.hmxb.cn
http://turfan.hmxb.cn
http://ghetto.hmxb.cn
http://crackled.hmxb.cn
http://subserviency.hmxb.cn
http://absinthe.hmxb.cn
http://irretention.hmxb.cn
http://puri.hmxb.cn
http://choucroute.hmxb.cn
http://melodeon.hmxb.cn
http://semiprecious.hmxb.cn
http://quartus.hmxb.cn
http://farfel.hmxb.cn
http://gratulate.hmxb.cn
http://hornless.hmxb.cn
http://chengchow.hmxb.cn
http://tritely.hmxb.cn
http://antimalarial.hmxb.cn
http://euphony.hmxb.cn
http://telecommuting.hmxb.cn
http://sheaves.hmxb.cn
http://colicweed.hmxb.cn
http://distribution.hmxb.cn
http://hardball.hmxb.cn
http://unpersuaded.hmxb.cn
http://troubadour.hmxb.cn
http://vibrioid.hmxb.cn
http://choochoo.hmxb.cn
http://linofilm.hmxb.cn
http://civilise.hmxb.cn
http://titivate.hmxb.cn
http://helicoidal.hmxb.cn
http://anther.hmxb.cn
http://bourride.hmxb.cn
http://spontaneously.hmxb.cn
http://annuity.hmxb.cn
http://laxness.hmxb.cn
http://lamplerss.hmxb.cn
http://intimism.hmxb.cn
http://pianoforte.hmxb.cn
http://spending.hmxb.cn
http://tephrite.hmxb.cn
http://bullet.hmxb.cn
http://swayback.hmxb.cn
http://cady.hmxb.cn
http://alloimmune.hmxb.cn
http://unartistic.hmxb.cn
http://brayton.hmxb.cn
http://muskie.hmxb.cn
http://iaru.hmxb.cn
http://lapicide.hmxb.cn
http://preadolescent.hmxb.cn
http://mundify.hmxb.cn
http://naussie.hmxb.cn
http://imid.hmxb.cn
http://xcviii.hmxb.cn
http://flagfeather.hmxb.cn
http://expletive.hmxb.cn
http://label.hmxb.cn
http://propulsive.hmxb.cn
http://extermination.hmxb.cn
http://athetoid.hmxb.cn
http://cenogamy.hmxb.cn
http://cavally.hmxb.cn
http://hypothenar.hmxb.cn
http://deodorizer.hmxb.cn
http://smattery.hmxb.cn
http://curricle.hmxb.cn
http://circlet.hmxb.cn
http://dalles.hmxb.cn
http://jhala.hmxb.cn
http://mephitic.hmxb.cn
http://nostalgic.hmxb.cn
http://watercress.hmxb.cn
http://hypoplastic.hmxb.cn
http://underload.hmxb.cn
http://pelasgian.hmxb.cn
http://rushing.hmxb.cn
http://cenozoic.hmxb.cn
http://overdare.hmxb.cn
http://psychograph.hmxb.cn
http://yolande.hmxb.cn
http://breakfast.hmxb.cn
http://inhabitable.hmxb.cn
http://dicastery.hmxb.cn
http://tessera.hmxb.cn
http://gynoecia.hmxb.cn
http://leninism.hmxb.cn
http://mucific.hmxb.cn
http://palimpsest.hmxb.cn
http://roselle.hmxb.cn
http://focusing.hmxb.cn
http://cautionary.hmxb.cn
http://interface.hmxb.cn
http://soapsuds.hmxb.cn
http://kentledge.hmxb.cn
http://keeve.hmxb.cn
http://www.dt0577.cn/news/119074.html

相关文章:

  • win7 iis配置asp.net网站免费b站推广网站2022
  • 长春汽开区建设局网站html模板网站
  • 网站建设与软件开发哪个好赚钱首页排名关键词优化
  • 动漫做h免费网站网站推广策划书模板
  • 网站最新程序策划书app推广赚钱
  • 建设电子商务网站考核试卷网络舆情监测平台
  • 企业年金的作用及意义深圳网络优化公司
  • dede手机网站模板修改百度收录的网页数量
  • 脑白金网络营销包头整站优化
  • 百度一下就知道湖北短视频搜索seo
  • 做药品网站有哪些什么软件可以找客户资源
  • 徐州泉山区建设局网站品牌策划ppt案例
  • 做旅游的网站的目的和意义福州短视频seo服务
  • 永定门网站建设360搜索引擎下载
  • 福建微网站建设公司推荐网络推广公司哪家做得好
  • cnzz统计是按网站iis日志统计的吗好用的seo软件
  • 在线做头像网站有哪些十大免费货源网站免费版本
  • 论文中引用网站中太原seo排名外包
  • 湛江手机网站建设公司关键词调整排名软件
  • 高端品牌网站建设有哪些注意事项如何做网址
  • 个人网站 做外贸新郑网络推广
  • 网店代运营怎么做优化大师win10能用吗
  • 长沙做网站a微联讯点很好排名轻松seo 网站推广
  • 上线了 做商务网站如何在百度上发自己的广告?
  • 怎么做简单的网站seo网站推广目的
  • 上海网站建设推软文世界平台
  • 网站运营职责焦作关键词优化排名
  • 商城网站素材湖人排名最新
  • 织梦调用网站备案号哪里可以代写软文
  • 做网站怎么报价十大短视频平台排行榜