刷题Day17-贪心
作者:互联网
因为最近刚刚入职,所以要学习很多的东西,没有多少时间来刷题和学习。最近刚刚忙完一阵,回归刷题。因为转了GO,所以以后刷题用go和java各刷一遍
452. 用最少数量的箭引爆气球
思路:首先按照气球的起始位置排序。i和j,遍历气球。从i到j个气球的尾部如果都包括第j个气球的尾部,那么j++,否则i=j,j++,ret++
go语言版本:
import ( "sort" ) func findMinArrowShots(points [][]int) int { sort.Slice(points, func(i, j int) bool{ if points[i][0] != points[j][0] { return points[j][0] > points[i][0] } return points[j][1] > points[i][1] }) i := 0 j := 1 min := points[i][1] ret := 0 for j < len(points) { if min >= points[j][0] { if min > points[j][1] { min = points[j][1] } j++ }else{ ret++ i = j j++ min = points[i][1] } } ret++ return ret }
435. 无重叠区间
思路:按照区间尾部进行排序。如果后面的区间的首部在前面的区间的尾部的左侧,那么这个区间就要剔除。
go语言版本:
import "sort" func eraseOverlapIntervals(intervals [][]int) int { sort.Slice(intervals, func(i, j int) bool{ return intervals[i][1] < intervals[j][1] }) ret := 0 end := intervals[0][1] for i := 1; i < len(intervals); i++ { if intervals[i][0] < end { ret++ }else { end = intervals[i][1] } } return ret }
56. 合并区间
思路:主要思路还是先排序,排序后就好办了
go版本:
有两个地方是新学习到的,注意一下。
一个是append。第一个参数是切片本身,第二个参数是新接入的切片。
一个是切片的声明
import ( "fmt" "sort" ) func merge(intervals [][]int) [][]int { //先排序 sort.Slice(intervals, func (i, j int) bool { if intervals[i][0] != intervals[j][0] { return intervals[i][0] < intervals[j][0] }else { return intervals[i][1] > intervals[j][1] } }) ret := [][]int{} start := intervals[0][0] end := intervals[0][1] for i := 1; i < len(intervals); i++ { if intervals[i][0] <= end { if end < intervals[i][1] { end = intervals[i][1] } }else { ret=append(ret, []int{start,end}) start = intervals[i][0] end = intervals[i][1] } } ret=append(ret, []int{start,end}) return ret }
763. 划分字母区间
这个还挺有挑战性。主要思路是先根据字符串做出区间,然后再合并区间
import "sort" func partitionLabels(s string) []int { b := [26][2]int{} numbers := b[:] for i := 0; i < 26; i++ { numbers[i][0] = -1 numbers[i][1] = -1 } for i, c := range s { if numbers[c-'a'][0] == -1 { numbers[c-'a'][0] = i numbers[c-'a'][1] = i }else { numbers[c-'a'][1] = i } } ret := []int{} sort.Slice(numbers, func (i, j int) bool{ return numbers[i][0] < numbers[j][0] }) var i int for i = 0; i < 26; i++ { if numbers[i][0] != -1{ break; } } start := numbers[i][0] end := numbers[i][1] for i = i+1; i < 26; i++ { if numbers[i][0] < end { if end < numbers[i][1] { end = numbers[i][1] } }else { ret = append(ret, end-start+1) start = numbers[i][0] end = numbers[i][1] } } ret = append(ret, end-start+1) return ret }
标签:Day17,int,points,ret,++,intervals,numbers,刷题,贪心 来源: https://www.cnblogs.com/wangqianming12138/p/16535339.html