回溯法 动态优化(自顶向上 自底向上) 最终(贪心法优化)

1. 55.跳跃游戏

1.1. 题目

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置

1.1.1. 举例

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

1.2. 思路

  • 这是一个大问题可以化成小问题的题目
  • 很明显,对于输入的那个串(举例:[2,3,1,1,4]), 每个元素都有多个对应值, 比如2对应 0,1,2
  • 但是回溯法的时间成本太高了(回溯法说到底就是个暴力遍历破解 )
    • 观察发现回溯法中的很多子问题是重复计算的
  • 为了解决重复的子问题结算导致浪费: 使用动态规划的算法, 动态规划有两种思路
    • 1.自顶向下思路: 自顶向下说到底就是大的问题化小的问题, 小的问题化更小的问题(本质是不用重复计算的递归回溯算法)
    • 2.自底向上思路: 相比与自顶向下算法, 自底向上更优秀一点,
        1. 不用递归(或用栈)节省了空间
      • 自底向上思路: 自底向上说到底就是在大问题可以化成小问题的基础想, 从小问题出发, 逐渐扩大, 最终扩大到原本问题的规模

1.3. 代码

	public boolean canJump2(int[] nums) {
		boolean[] can=new boolean[nums.length];// 默认为false
		can[nums.length-1]=true;// 最尾为真(可跳)
		int jumpMax=0;
		for(int i=nums.length-2;i>=0;i--) {
			jumpMax=Math.min(i+nums[i], nums.length-1);
			for(int j=i+1;j<=jumpMax;j++)
				if(can[j]) {
					can[i]=true; break;
				}
		}
		return can[0];
	}

但是
在这里插入图片描述
明显不够优秀

  • 观察发现:
for(int j=i+1;j<=jumpMax;j++)
	if(can[j]) {
		can[i]=true; break;
	}
  • 其实这个代码就是找足够大的数 能够到那些已经计算过能够到串尾的元素👇

1.3.1. 改进版的代码

public boolean canJump(int[] nums) {
		int leftMostIndex=nums.length-1;// 初始化为最右元素
		for(int i=nums.length-1;i>=0;i--) {// 从后往前
			if(leftMostIndex<=nums[i]+i)//i处的元素够得到 '最左可达元素'
				leftMostIndex=i;
		}
		return leftMostIndex==0;
	}

在这里插入图片描述
妈的代码又短又厉害, 你咋这么牛咧👄

1.4. 参考link

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 分治策略是将一个复杂的问题分解成相互独立的子问题,然后递归地解决这些子问题,最后合并子问题的解得到原问题的解;动态规划是一种在求解复杂问题时寻求最优解的通用技术,它通过把原问题分解为相互依赖的子问题来实现;贪心是一种在每一步都采取在当前状态下最优的选择,从而希望导致结果是最优的算回溯是一种试错,它尝试分步解决一个复杂的问题,当它发现某一步无论如何也无得到正确解决方案时,就会回溯到前一步并重新尝试。 ### 回答2: 分治策略、动态规划、贪心回溯都是解决问题的常用算思想,它们在解决问题的方式和适用场景上有不同的特点。 分治策略是将问题分解为更小的子问题,在将子问题解决后进行合并得到整体问题的解。分治策略适用于问题可以分解为相同类型的子问题,并且子问题的解可以独立求解的情况。典型的应用包括快速排序和合并排序。 动态规划是一种以自向上的方式逐步求解问题的优化。它将问题划分为重叠且相互依赖的子问题,使用一张表来记录子问题的解,通过解决子问题的最优解来解决整体问题。动态规划适用于满足最优子结构和无后效性的问题,常见的应用有背包问题和最短路径问题。 贪心是一种选择当前最优策略的方,并且期望通过每一步的最优选择最终得到全局最优解。贪心通常没有全局优化的策略,而是通过选择局部最优解来进行推进。贪心适用于满足贪心选择性质和最优子结构的问题,例如霍夫曼编码和最小生成树问题。 回溯是一种通过穷举所有可能的解来寻找问题解的方。它采用试错的方式进行搜索,并在搜索过程中通过剪枝操作来减少不必要的计算。回溯适用于问题解空间规模较小的情况,例如八皇后问题和0-1背包问题。 综上所述,分治策略通过分解子问题并合并解决整体问题,动态规划通过记录子问题的解来逐步求解整体问题,贪心通过每一步的最优选择来推进解决整体问题,回溯通过穷举所有可能的解来寻找问题解。这四种算思想各有不同的应用场景,根据问题的特点选择合适的算可以更高效地解决问题。 ### 回答3: 分治策略、动态规划、贪心回溯是算设计中常用的四种策略。它们具有各自独特的特点和应用场景。 分治策略是将问题划分为若干个规模较小且结构相似的子问题,通过递归地解决子问题,最后合并得到原问题的解。分治策略适用于问题可以分解为独立子问题,并且合并子问题的解不会产生冲突。典型应用如归并排序和快速排序。 动态规划是通过将问题划分为相互重叠的子问题,并求解子问题的解来求解原问题。动态规划通常适用于具有最优子结构的问题,可以通过空间换时间来提高效率。通过构建状态转移方程和建立递推关系,逐步计算得到最优解。典型应用如背包问题和最短路径问题。 贪心是一种每一步都选择当前状态下的最优解,以求得全局最优解的策略。它通过每一步的最优选择,局部地达到全局最优。贪心通常适用于问题具有贪心选择性质,即每个子问题都可以通过选取局部最优解而得到全局最优解。典型应用如霍夫曼编码和最小生成树算回溯是一种通过穷举所有可能的解,并逐步构建可行解的方。它采用试错的方式,在每一步都通过选择一个可能的解决方案,然后进行尝试。若尝试失败,则回溯到上一步重新选择。回溯适用于问题的解空间较小,且要求找出所有可能的解或满足特定条件的解。典型应用如八皇后问题和旅行商问题。 总之,分治策略、动态规划、贪心回溯都是解决问题的有效策略,通过合适的选择和设计,可以在不同的问题领域中获得最优解或满足特定条件的解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值