IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode:87场双周赛总结 = 思维贪心专场 -> 正文阅读

[数据结构与算法]leetcode:87场双周赛总结 = 思维贪心专场

在这里插入图片描述

分析

这个需要注意前缀和的时候要补一个0
然后两种不相交的情况
相交的话start取max end取min
好一道恶心模拟

ac code

class Solution:
    def countDaysTogether(self, arriveAlice: str, leaveAlice: str, arriveBob: str, leaveBob: str) -> int:
        months = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        preSum = list(accumulate(months))
        #print(preSum)
        def getDay(s):
            mm, dd = map(int, s.split('-'))
            #print(mm, dd, preSum[mm - 1], preSum[mm - 1] + dd)
            return preSum[mm - 1] + dd
        
        a_start = getDay(arriveAlice)
        a_end = getDay(leaveAlice)
        b_start = getDay(arriveBob)
        b_end = getDay(leaveBob)
        
        #print(a_start, a_end)
        #print(b_start, b_end)
        if a_start > b_end or a_end < b_start:
            return 0
        else:
            return min(a_end, b_end) - max(a_start, b_start) + 1

在这里插入图片描述

分析

双指针简单贪心匹配

ac code

class Solution:
    def matchPlayersAndTrainers(self, players: List[int], trainers: List[int]) -> int:
        cnt = 0
        players.sort()
        trainers.sort()
        n, m = len(players), len(trainers)
        i, j = 0, 0
        while i < n and j < m:
            if players[i] <= trainers[j]:
                cnt += 1
                i += 1
                j += 1
            else:
                j += 1
        
        return cnt

在这里插入图片描述

分析

逆向统计最大值(全部异或)
然后正向双指针记录30位的一个数组curr,一旦符合就挪动l这个样子
直到不符合为止继续挪动r
注意要用curr记录每个位的个数,方便挪动的时候增加删除
然后根据curr得出一个十进制的结果即可,大于1的只算1

Ac code

class Solution:
    def smallestSubarrays(self, nums: List[int]) -> List[int]:
        n = len(nums)
        target = [0] * n
        for i in range(n - 1, -1, -1):
            if i == n - 1:
                target[i] = nums[i]
            else:
                target[i] = target[i + 1] | nums[i]
        #print(target)
        
        ans = [1] * n
        curr = [0] * 30
        l = 0
        
        for r in range(n):
            tmp = bin(nums[r])[2:].zfill(30)
            for i, v in enumerate(tmp):
                if v == '1':
                    curr[i] += 1
            curr_num = 0
            for i in range(30):
                if curr[i] >= 1:
                    curr_num += pow(2, 29 - i)
            #print(l, r, curr_num, target[l], curr)
            while l <= r and curr_num == target[l]:
                #print(l, r, curr_num, curr)
                ans[l] = r - l + 1
                tmp = bin(nums[l])[2:].zfill(30)
                for i, v in enumerate(tmp):
                    if v == '1':
                        curr[i] -= 1
                curr_num = 0
                for i in range(30):
                    if curr[i] >= 1:
                        curr_num += pow(2, 29 - i)
                l += 1
        
        return ans

在这里插入图片描述

分析

我们要考虑最坏的情况
什么是最坏的情况呢?
1.先弄完全部负收益的交易,然后再来一个cost最大的cost的正收益的
2.先弄完差一个的全部负收益的交易,然后再来一个负收益的cost剪掉
我们可以先把总的负收益算出来
然后分两种情况遍历(正收益,负收益),看看在当前负收益的情况下加上一个cost哪个最大即可

Ac code

class Solution:
    def minimumMoney(self, transactions: List[List[int]]) -> int:
        # 最坏情况:
        # 在拿完所有负收益后,再来一个正收益的
        # 在拿完除当前负收益的其他负收益后,再来当前负收益的

        # 所有负收益的总和
        tot_bad = 0
        for cost, cashback in transactions:
            if cost > cashback:
                tot_bad += cost - cashback
        
        # 本质就是一个贪心greedy
        ans = 0
        for cost, cashback in transactions:
            # 如果是一个正收益的
            # 负收益总和 + 当前cost
            if cost <= cashback:
                ans = max(ans, tot_bad + cost)
            # 如果是一个负收益的
            # 负收益总和 - 当前负收益 + 当前cost
            else:
                ans = max(ans, tot_bad - (cost - cashback) + cost)
        
        return ans

总结

第一题恶心模拟,细节要注意
第三题,不能直接异或,要用30位数组记录,但多了30可以忍受的
第四题,怎么样的情况才是最坏的,先计算总的负收益,然后枚举交易,对于正收益的和负收益的要分类塔伦
正收益直接看cost,负收益的话要在总的负收益里面去掉当前的再看cost

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:52:38  更:2022-09-21 00:57:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 15:36:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码