一,Leetcode 452. 用最少数量的箭引爆气球
该题我没想到好的思路,所以看答案吧。。。
答案使用排序加贪心的算法完成,排序是按气球右端位置的大小升序。目的很简单,为了可以看到最短的那个。因为要保证所有的气球都被射到,那么应该先考虑右端最短的那个气球,因为他必须要被先射到。否则在往右边去就射不到了,要射到它有很多点可以采用,那么选择哪一个点更好呢?这里就用到贪心算法了,试想一下,往左边,还是右边射,射的会更多。毫无疑问是右边,因为我们是按升序排列的,本身选择的就是最小的,在往左边就更小,要想包含更多的气球,必须要在最右端射,射到这个气球的同时要额外射到更多别的气球。这样就实现了贪心。然而能射到的点是有限的,所以当它遇到射不到的点时,就需要用另一支箭了。
/**
* @param {number[][]} points
* @return {number}
*/
var findMinArrowShots = function(points) {
if(points.length==0){
return 0;
}
let pp=points.sort((a,b)=>a[1]-b[1]);//按右端排序
let st_pos=pp[0][1];//选择第一支箭的位置
let end=1;
for(let i=1;i<pp.length;i++){
if(pp[i][0]>st_pos){//该位置的箭无法射到该气球
st_pos=pp[i][1];//更新新箭的位置
end++;//添加箭
}
}
return end;
};
二,Es6 Generator函数与Thunk的异步运用
学习文档
Generator是解决异步编程的方案
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。
任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。
前面为参数args,后一个为回调函数callback。
function thunkify(fn) {//thunkify源码
return function() {//返回构造函数
var args = new Array(arguments.length);
var ctx = this;
for (var i = 0; i < args.length; ++i) {
args[i] = arguments[i];//复制参数
}
return function (done) {//传入回调函数
var called;
args.push(function () {//将回调函数加入到参数里面去
if (called) return;
called = true;//确保只执行了一次
done.apply(null, arguments);//这里的arguments是回调出来的参数
});
try {
fn.apply(ctx, args);//执行函数
} catch (err) {//捕捉错误
done(err);
}
}
}
};
上面的代码可以构造一个thunk函数
异步解决方案
- 只用thunk函数执行的异步
function sleep(val,fun){//异步函数,前面为参数,后面为回调函数
window.setTimeout(()=>{
console.log("--------"+val);
fun("dataaaaaaaaa");
},1000);
}
let sthunk=thunkify(sleep);
let ss=sthunk('1111')((data)=>{//只用thunk函数执行的异步
console.log(data);
sthunk('2222')((data)=>{
console.log(data);
})
});
- 使用generator流程控制
let gen=function* (){
yield sthunk('da11111');
yield sthunk('da22222');
}
let g=gen();
let r=g.next();
r.value((data)=>{//使用generator流程控制
console.log(data);
let g1=g.next();
g1.value((data)=>{
console.log(data);
})
})
- 配合使用
let gen0=function* (){//创建generator
let da1=yield sthunk('da11111');
console.log(da1);
let da2= yield sthunk('da22222');
console.log(da2);
}
function run(fn) {//自动运行函数
let gen = fn();
function next(data) {
let result = gen.next(data);
if (result.done) return;
result.value(next);
}
next();
}
run(gen0);