交集、并集、差集
var s1=new Set(['a','b','c','v']);
var s2=new Set(['a','c','f','h']);
//获得交集
var co=new Set([...s1].filter(item=>s2.has(item)));
console.log(co);
//获得并集
var binji=new Set([...s1,...s2]);
console.log(binji);
//获得差集
var diff=new Set([...s1].filter(item =>!s2.has(item)));
console.log(diff);
《算法图解》中,用贪心算法,得到用最少的电台,覆盖全美50个州
思路,每次获取覆盖州最多的电台,直到覆盖完毕,即使覆盖了已经被覆盖的
使用散列表来存储每个电台,可以覆盖的州
//贪心算法 选出一个广播台 它覆盖最多的未覆盖的州,即使这个广播台覆盖了一些已覆盖的州
let states_need = new Set(['mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az']);
// console.log(states_need);
let stations = new Map();
stations.set('kone', new Set(['id', 'nv', 'ut']));
stations.set('ktwo', new Set(['wa', 'id', 'mt']));
stations.set('kthree', new Set(['or', 'nv', 'ca']));
stations.set('kfour', new Set(['nv', 'ut']));
stations.set('kfive', new Set(['ca', 'az']));
//最终得到的电台
let final_stations=[];
//只要州还没被覆盖完,就要继续遍历
while(states_need.size!== 0){
//每次遍历选出覆盖最多的电台
let best_station='';
//广播台覆盖的所有未覆盖的州
let cover_state=new Set();
for(let [station,state] of stations){
//求交集,未覆盖的州和当前电台下覆盖州的交集
let cover=new Set([...states_need].filter(item=>state.has(item)))
//只要这次的覆盖州比上次电台覆盖州多,就更新best_sattions直到循环结束
if(cover.size >cover_state.size){
best_station=station;
cover_state=cover;
}
}
//更新未覆盖的州
//求差集
states_need=new Set([...states_need].filter(item=>!cover_state.has(item)));
final_stations.push(best_station);
}
console.log(final_stations);