ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

刷题Day17-贪心

2022-07-30 17:00:54  阅读:180  来源: 互联网

标签:Day17 int points ret ++ intervals numbers 刷题 贪心


因为最近刚刚入职,所以要学习很多的东西,没有多少时间来刷题和学习。最近刚刚忙完一阵,回归刷题。因为转了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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有