Comments (6)
m层楼n个鸡蛋的问题,也可以用动态规划试试
from basic-programming-knowledge.
楼层扔鸡蛋问题 K个鸡蛋 N层楼
// 常规递增
// dp[i][j] 表示i楼j个蛋的最坏情况尝试次数
function egg(K, N) {
let dp = new Array(N + 1).fill(0).map(() => new Array(K + 1).fill(0));
for (let i = 1; i <= N; i++) dp[i][1] = dp[i - 1][1] + 1;
for (let i = 1; i <= K; i++) dp[1][i] = 1;
for (let k = 2; k <= K; k++) {
for (let n = 2; n <= N; n++) {
// 两个方向累积的和
let min = Number.MAX_SAFE_INTEGER;
for (let x = 1; x <= n; x++) {
let max = 1 + Math.max(dp[x - 1][k - 1], dp[n - x][k]);
if (max < min) {
min = max;
}
}
dp[n][k] = min;
}
}
return dp[N][K];
}
// 一维数组dp[i]表示i个蛋的最坏尝试次数,大于等于N时截止
function egg2(K, N) {
// k个鸡蛋最坏扔的次数,最坏次数不会超过N,因为可以用一个鸡蛋从0 开始到N依次扔
let dp = new Array(K + 1).fill(0);
let cnt = 0;
while (dp[K] < N) {
cnt++;
for (let i = K; i > 0; i--) {
dp[i] = dp[i - 1] + dp[i] + 1;
}
}
console.log('egg2', cnt);
return cnt;
}
// 二分策略
// dp[i][j]表示i楼j个蛋的尝试次数。他等于dp[i - 1][j - 1]的次数加上 dp[i -1][j]的次数,再加上本次尝试的1
// dp[i][j] 也表示目标为i的情况,j个蛋的尝试次数
function egg3(K, N) {
let dp = new Array(N + 1).fill(0).map(() => new Array(K + 1).fill(0));
for (let n = 1; n <= N; n++) {
for (let k = 1; k <= K; k++) {
dp[n][k] = dp[n - 1][k - 1] + dp[n - 1][k] + 1;
if (dp[n][k] >= N) {
return n;
}
}
}
return N;
}
from basic-programming-knowledge.
硬币凑数字问题 coins无限使用凑amount
/**
* @param {number} amount
* @param {number[]} coins
* @return {number}
*/
var change = function(amount, coins) {
// dp[i]表示i块的最大组合数
let dp = new Array(amount + 1).fill(0);
dp[0] = 1
for (const coin of coins) {
for (let i = 0; i <= amount; i++) {
if (i - coin >= 0) {
dp[i] += dp[i - coin]
}
}
}
return dp[amount]
};
console.log(change(5, [1,2,5]))
from basic-programming-knowledge.
接雨水
/*
* @lc app=leetcode.cn id=42 lang=javascript
*
* [42] 接雨水
*/
/**
* @param {number[]} height
* @return {number}
*/
// 总装水可以拆解为每个凹凼装水 存在几种情况
// 1. 两边高 中间低。标准凹凼
// 2. 中间高 两边低。需要拆分
// a. 左边整体趋势为拔高。因此可以逐个灌水
// b. 右边整体趋势为降低。因此可以反向灌水
// 分析了两种情况,其实第1个也可以归结为2.a类型。因为只需要正向一次性灌水就可以完成
// 所以我们采用双向灌水获得最终水量
const trap = function(height) {
const len = height.length
if (len <= 2) return 0
let start = 0
let end = start + 1
let water = 0
// 计算一个区间内的【石头】数量
function calcStone(height, start, end) {
let stone = 0
for (let i = start + 1; i < end; i++) {
stone = stone + height[i]
}
return stone
}
// 计算当前区间内装得下的水
function calcWater (start, end, minValue, stone) {
return (end - start - 1) * minValue - stone
}
// 正向灌水 灌水完毕后有两种情况
// 1 end === len && start < end - 1 说明start比右边都要大,需要反向灌水一次
// 2 end === len && start === end - 1 说明正向灌水已经满足全部情况
while (end < len) {
while (height[end] < height[start]) end++
// 对应一次灌水完毕的情况(小迭代中)
if (end >= len) {
break
}
// 计算水量,重置指针
water = water + calcWater(start, end, height[start], calcStone(height, start, end))
start = end
end = start + 1
}
// 反向灌水 起始start肯定是比右边所有数字都要大
if (start < end - 1) {
end = end - 1
// 指针反向遍历
let j = end - 1
while (j > start) {
// 每次遇到比后排要大的值 就计算一次区间水量
while(height[j] <= height[end]) j--
water = water + calcWater(j, end, height[end], calcStone(height, j, end))
end = j
j = end - 1
}
}
return water
}
const arr = [0,1,0,2,1,0,1,3,2,1,2,1] // 6
// const arr = [5, 2, 3, 4] // 3
// const arr = [9, 0, 6, 0, 4, 2, 4] //12
// console.log(trap(arr))
function trap2(nums) {
let left = [nums[0]];
for(let i = 1; i < nums.length; i++) {
left[i] = Math.max(left[i - 1], nums[i])
}
let right = [];
right[nums.length - 1] = nums[nums.length - 1];
for(let i = nums.length - 2; i >= 0; i--) {
right[i] = Math.max(right[i + 1], nums[i]);
}
let dp = [];
let max = 0;
for(let i = 0; i < nums.length; i++) {
dp[i] = Math.min(left[i], right[i]) - nums[i];
max += dp[i]
}
console.table(dp)
console.log(max)
return max
}
trap2(arr)
from basic-programming-knowledge.
硬币凑整数
// 25 10 5 1
// f(x) = f(x - 20) + f(x - 10) + f(x - 5) + f(x - 1)
function coinCountWays(coins, sum) {
let dp = new Array(sum + 1).fill(0);
// 核心 起始点。没有硬币也是一种方法
dp[0] = 1;
for(let j = 1; j <= sum; j++) {
for(let i = 0; i < coins.length; i++) {
if (j - coins[i] >= 0) {
dp[j] = dp[j] + dp[j - coins[i]];
}
}
}
console.table(dp)
return dp[sum]
}
console.log(coinCountWays([25, 10, 5, 1], 5))
from basic-programming-knowledge.
最长子序列 单数组
/**
* @param {string} text1
* @param {string} text2
* @return {number}
*/
var longestCommonSubsequence = function(text1, text2) {
if (!text1.length || !text2.length) return 0
let dp = new Array(text2.length).fill(0);
for(let i = 0; i < text1.length; i++) {
// 上一个dp[j]
let cache = 0;
for(let j = 0; j < text2.length; j++) {
let dj = dp[j];
if (text1[i] === text2[j]) {
dp[j] = cache + 1;
} else {
dp[j] = Math.max(dp[j - 1] || 0, dp[j])
}
cache = dj;
}
}
console.table(dp)
return dp[text2.length - 1];
};
console.log(longestCommonSubsequence('bl', 'yby'))
from basic-programming-knowledge.
Related Issues (20)
- 【笔记】重读EventLoop HOT 2
- webpack原理
- 2021-11-25 图论
- 【VIM】编辑器相关整理
- 【Rust】资源汇总
- 【React】资源汇总
- 【tools】最有用的那些软件、站点-工具链
- 【英语】学习资源
- 【vim】文艺复兴·VIM使用指南·Day 1
- 【vim】文艺复兴·VIM使用指南·Day 2
- 【vim】文艺复兴·VIM使用指南·Day 3
- 【翻译】monio关于monad的解释
- 【函数式编程】函子 HOT 1
- 【异步】async/await比Promise好吗?
- 【杂文】述职报告的思考
- 【函数式编程】什么是lambda演算? HOT 1
- 【函数式编程】haskell语言-haskell趣学指南 HOT 5
- 【工程化】如何创建一个现代化的前端基础库
- wsl2开发环境设置排坑
- 前端库
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from basic-programming-knowledge.