力扣对应的贪心算法共4题
解题思路:因为只能买卖一次,取最左最小值,最右最大值的最大差值就是最大利润
/**
* @param {number[]} prices
* @return {number}
*/
const maxProfit=(prices)=>{
let res = 0;
let minPrice = prices[0];
for(let i = 0;i<prices.length;i++){
res = Math.max(res,prices[i]-minPrice);
minPrice = Math.min(minPrice,price[i])
}
return res
}
解题思路:判断能否跳到最后,需要判断每一个位置累计的最大范围是否包含最后一位
/**
* @param {number[]} nums
* @return {boolean}
*/
const canJump=(nums)=>{
if(nums.length === 1) return true;
let cover = 0;
for(let i=0;i<=cover;i++){
cover = Math.max(cover,i+nums[i]);
if(cover>=nums.length-1) return true
}
return false
}
解题思路:最少步数其实就是累计到达最大区间的次数
/**
* @param {number[]} nums
* @return {boolean}
*/
const jump=(nums)=>{
let steps = 0;
let cover = 0;
let current = 0;
for(let i=0;i<nums.length;i++){
cover = Math.max(cover,i+nums[i]);
if(i === current){
step++;
current = cover
}
}
return steps
}
解题思路:需要记录每个字符的出现的最远位置,遍历整个字符串,不断更新最远距离,如果当前位置等于最远位置,就是一个字母区间。记录这个位置,继续片遍历,继续切割
/**
* @param {string} s
* @return {number[]}
*/
const partitionLabels=(s)=>{
const maxPos = {};
//记录每个字母的最远位置
for(let i = 0;i<s.length;i++){
maxPos[s[i]] = i
}
let res = []; //存储字母区间长度
let start = 0; //切割的起始位置
let canSlibPos = 0; //最远位置
for(let i = 0;i<s.length;i++){
canSlibPos = Math.max(canSlibPos,maxPos[s[i]]); //更新最远位置
if(i == canSlibPos){ //到达切割点
res.push(i-start+1);
start = i + 1; //更新切割的起始位置
}
}
return res
}