其他分享
首页 > 其他分享> > 刷题Day17-贪心

刷题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