818. race car

本文针对LeetCode 818题提出了一种动态规划解决方案,通过数学分析确定了达到目标所需的最少步骤。文章详细解释了如何通过递归函数计算不同目标位置的最佳路径,并考虑了二进制表示在解决问题中的作用。

参考链接:https://www.cnblogs.com/qisfj/p/leecode818.html

采用动态规划方法解题,

设dp[t]表示target为t时,最少需要的步数。

将连续的n次A操作改变的position记为nA,很显然,+iA-jA+kA等价于+kA-jA+iA,同时+iA+kA等价于+kA+iA。
所以当存在一串操作使position始终没有超过t,那么可以首先尽量尝试达到position,也就是说在position+speed<tposition+speed<t的情况下,
继续A操作依然可以保证有必要遍历的情况被遍历了。
假设t的二进制表示一共有i位,则iA即可影响到最高位,不需要有(i+1)A,因为若是出现了(i+1)A就必然影响了i+1位,为了使i+1位保持0由以下几种方式,
若之前执行的是+(i+1)A,那么就执行-(i+1)A,执行两次+iA,但无疑都多出了许多无意义的操作。
所以要达到一个t,若存在n使得2n−1=t2n−1=t成立,此n就是最佳的步数。否则,设n使2n−1−1<target<2n−12n−1−1<target<2n−1成立,则t可以从以下两种的一种中到达。
先到达2n−12n−1再经过一个R操作和dp[2n−1−t2n−1−t]次操作回到t。

先到达2n−1−12n−1−1再经过R操作、i个A操作、R操作、dp[t−2n−1+2it−2n−1+2i]操作回到t,其中i<n−1

class Solution {
public:
	int dp[10001];

	int racecar(int t){
		if (dp[t] != 0)
			return dp[t];
		int n = floor(log2(t)) + 1;
		if (1 << n == t + 1) dp[t] = n;
		else {
			dp[t] = n + 1 + racecar((1 << n) - 1 - t);//2^n-1、R、dp[2^n-1-t]
			for (int i = 0; i<n - 1; i++)//2^{n-1}-1、R、i个A、R、dp[t-2^{n-1}+2^i}]
				dp[t] = min(dp[t], n + i + 1 + racecar(t - (1 << (n - 1)) + (1 << i)));
		}
		return dp[t];
	}
};

2n1

`Promise.race()` 是 JavaScript 中 `Promise` 构造函数的一个静态方法,用于处理多个 Promise。它接收一个 Promise 可迭代对象(如数组),并返回一个新的 Promise。一旦其中任意一个 Promise **被解决**(resolve)或**被拒绝**(reject),该新 Promise 就会立即以相同的结果或原因进行 resolve 或 reject。 换句话说,`Promise.race()` 会“赛跑”:哪个 Promise 最快完成(无论是成功还是失败),就以它的结果为准。 --- ### 示例代码: ```javascript const p1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'P1 成功'); }); const p2 = new Promise((resolve, reject) => { setTimeout(reject, 300, 'P2 失败'); }); const p3 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, 'P3 成功'); }); Promise.race([p1, p2, p3]) .then(value => { console.log('成功:', value); }) .catch(error => { console.error('失败:', error); }); ``` --- ### 解释: - `p1` 在 500ms 后 resolved。 - `p2` 在 300ms 后 rejected。 - `p3` 在 1000ms 后 resolved。 - 因为 `p2` 是最快结束的 Promise,并且它是 rejected 的,所以整个 `Promise.race([...])` 立即进入 `.catch()` 分支,输出: ``` 失败: P2 失败 ``` --- ### 使用场景: 1. **设置超时机制**:如果你希望某个异步操作在一定时间内完成,否则就视为失败,可以使用 `Promise.race()` 配合一个定时器 Promise。 ```javascript function timeout(ms) { return new Promise((_, reject) => { setTimeout(() => reject('请求超时'), ms); }); } fetchSomeData() .race(timeout(5000)) .then(data => console.log('获取数据成功:', data)) .catch(err => console.error('出错:', err)); ``` 2. **多来源取最快结果**:比如从多个 API 获取相同数据,选择响应最快的那一个。 --- ### 注意事项: - 如果传入的 Promise 数组中有一个立即 resolve 或 reject 的 Promise,则 `race` 会立即返回。 - 如果数组为空,`Promise.race([])` 会永远处于 pending 状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值