LeetCode刷题--贪心算法

本文探讨了几个算法问题的解决方案,包括分配糖果、买卖股票、无重叠区间、种花问题和字母区间划分等。通过排序和数学方法优化问题,如寻找最大利润、最少操作次数和最短区间划分。同时,展示了如何在信息技术中运用这些策略解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

455. 分糖果

def findContentChildren(self, g, s):
    """
    :type g: List[int]
    :type s: List[int]
    :rtype: int
    """
    g.sort()
    s.sort()
    i,j,num = 0,0,0
    while i<len(g) and j<len(s):
        if g[i]<=s[j]:
            num += 1
            i+=1
        j += 1
    return num

135. 糖果

def candy(s):
    init = [1] * len(s)
    l = len(s)
    for i in range(l-1):
        if s[i+1] > s[i]:
            init[i+1] += 1

    for j in range(1, l):
        if (s[l-j] < s[l-j-1]) and (init[l-j] >= init[l-j-1]):
            init[l-j-1] = init[l-j] + 1

    return init

435. 无重叠区间

def eraseOverlapIntervals(intervals):
    intervals_sort = sorted(intervals, key=lambda x: x[-1])
    length = len(intervals_sort)
    max_num = intervals_sort[0][-1]
    k = 1
    for item in range(1, length):
        if intervals_sort[item][0] >= max_num:
            k += 1
            max_num = intervals_sort[item][-1]
    return length - k

605. 种花问题

def canPlaceFlowers(flowerbed, n):
    flowerbed = [0] + flowerbed + [0]
    length = len(flowerbed)
    for i in range(1, length - 1):
        if flowerbed[i - 1] == 0 and flowerbed[i + 1] == 0 and flowerbed[i] == 0:
            flowerbed[i] = 1
            n = n - 1
    return n <= 0

452. 用最少数量引爆气球

def findMinArrowShots(points):
    points_sort = sorted(points, key=lambda x: x[1])
    min_p = None
    k = 0
    for point in points_sort:
        if min_p == None:
            min_p = point[1]
        if point[0] > min_p:
            min_p = point[1]
            k += 1
    if min_p == None:
        return k
    return k + 1

763. 划分字母区间

def partitionLabels(s):
    dic = {}

    for i in range(len(s)):
        if s[i] in dic:
            dic[s[i]].append(i)
        else:
            dic[s[i]] = [i]
    all_alpha = sorted([[dic[i][0], dic[i][-1]] for i in dic], key=lambda x: x[0])
    print(all_alpha)
    k = 0
    min_p = all_alpha[0][0]
    max_p = all_alpha[0][1]
    res = []
    i = 0
    for item in all_alpha:
        if item[0] > max_p:
            res.append(max_p - min_p + 1)
            min_p = item[0]
            max_p = item[1]
        else:
            max_p = max(item[1], max_p)
    res.append(max_p - min_p + 1)

    return res

122. 买卖股票最佳时机II

def maxProfit(prices):
    total = 0
    for i in range(1, len(prices)):
        if prices[i] - prices[i - 1] > 0:
            total = total + prices[i] - prices[i - 1]
    return total

406. 根据身高重排

def reconstructQueue(people):
    people = sorted(people, key=lambda x: (-x[0], x[1]))
    result = []
    print(people)
    for user in people:
        result.insert(user[1], user)
    return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值