文章目录
 
 
代码随想录之贪心系列区间问题算法
 
1.跳跃游戏
 
1.1贪心算法
 
func canJump(nums []int) bool {
	farthest := 0
	for i, v := range nums {
		
		farthest = max(farthest, i+v)
		
		if farthest >= len(nums)-1 {
			return true
		}
		
		if farthest == i {
			return false
		}
	}
	return false
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
 

 
1.2动态规划
 
 

 
2.跳跃游戏II
 
2.1贪心算法(详细版)
 
func jump(nums []int) int {
	a := 0               
	maxdistace := 0      
	nextmaxdistance := 0 
	
	for i, v := range nums {
		
		nextmaxdistance = max(nextmaxdistance, i+v)
		if i == maxdistace {
			if maxdistace != len(nums)-1 {
				a = a + 1 
				maxdistace = nextmaxdistance
				
                
				if nextmaxdistance >= len(nums)-1 {
					return a
				}
			} else if maxdistace == len(nums)-1{
				return a 
			}
		}
	}
	return a
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
 
2.2贪心算法(优化版)
 
func main() {
	jump([]int{2, 3, 1, 1, 4, 3, 2, 5})
}
func jump(nums []int) int {
	a := 0               
	maxdistace := 0      
	nextmaxdistance := 0 
	
    
    
    
    
    
	for i :=0;i<len(nums)-1;i++  {
		
		nextmaxdistance = max(nextmaxdistance, i+nums[i])
        
		if i == maxdistace {
			
			maxdistace = nextmaxdistance
			a++
		}
	}
	return a
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
    
}
 即一定存在一条路线能够到达最后一个位置,而不是说中间没有 0 ,只是存在可以越过 0 的路线
i=0: nextmaxdistance=2 进入if循环  maxdistace=2 a=1
i=1:nextmaxdistance=2 不进入if循环
i=2 nextmaxdistance=4  进入if循环  maxdistace=4  a=2
i=3 nextmaxdistance=4  不进入if循环  
i=4 nextmaxdistance=8  进入if循环  maxdistace=8 a=3
 

 

 

 

 

 
2.3动态规划
 
func jump(nums []int) int {
    
    
    
    
    
    f := make([]int, len(nums))
    f[0] = 0
    for i := 1; i < len(nums); i++ {
        
        f[i] = i
        
        
        for j := 0; j < i; j++ {
            
        
            
            if nums[j]+j >= i {
                
                f[i] = min(f[j]+1,f[i])
            }
        }
    }
    return f[len(nums)-1]
}
func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}
使用数组dp[i]记录跳跃到当前位置所需的最少跳跃次数,dp[i]由dp[j]决定(其中0<=j<i),当j+nums[j]>=i时,说明可以从位置j跳跃到位置i,从所有可以跳跃的j中选出最小的dp[j],则到达当前位置的最小跳跃次数为dp[i]=dp[j]+1。最后返回终点的dp[n-1]即为到达数组最后一个位置所需的最小跳跃次数(其中n为nums长度)。
 

 

 
3.合并区间
 
3.1贪心算法
 
func merge(intervals [][]int) [][]int {
    
    sort.Slice(intervals,func(i,j int)bool{
        return intervals[i][0]<intervals[j][0]  s
    })
    
    for i:=0;i<len(intervals)-1;i++{
      
        if intervals[i][1]>=intervals[i+1][0]{
            intervals[i][1]=max(intervals[i][1],intervals[i+1][1])
            intervals=append(intervals[:i+1],intervals[i+2:]...)
            i--
        }
    }
    return intervals
}
func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}
 

 

 

 

 
4.划分字母区间
 
4.1贪心算法
 
func partitionLabels(s string) []int {
	var res []int
	var marks [26]int
	size, left, right := len(s), 0, 0
	
	for i := 0; i < size; i++ {
		
		marks[s[i]-'a'] = i
		
	}
	
	for i := 0; i < size; i++ {
		
		right = max(right, marks[s[i]-'a'])
		if i == right {
			res = append(res, right-left+1)
			left = i + 1 
		}
	}
	return res
}
func max(a, b int) int {
	if a < b {
		a = b
	}
	return a
}
 

 

 

 
5.无重叠区间
 
5.1贪心算法
 
func eraseOverlapIntervals(intervals [][]int) int {
	var flag int
	
    
	sort.Slice(intervals,func(i,j int)bool{
		return intervals[i][0]<intervals[j][0]
	})
	
	for i:=0;i<len(intervals)-1;i++{
        
		if intervals[i][1]>intervals[i+1][0]{
            
			flag++
            
			intervals[i+1][1]=min(intervals[i][1],intervals[i+1][1])
		}
	}
	return flag
}
func min(a,b int)int{
	if a>b{
		return b
	}
	return a
}
 

 
6.用最少数量的箭引爆气球
 
6.1贪心算法
 
func findMinArrowShots(points [][]int) int {
	var res int =1
	
	sort.Slice(points,func (i,j int) bool{
		return points[i][0]<points[j][0]
	})
	for i:=0;i<len(points)-1;i++{
		if points[i][1]<points[i+1][0]{
			res++
		}else{
            
			points[i+1][1] = min(points[i][1], points[i+1][1]); 
		}
	}
	return res
}
func min(a,b int) int{
	if a>b{
		return b
	}
	return a
}
 

 

 

 
