【日常系列】LeetCode《24·贪心1》

news2024/9/21 16:36:33

数据规模->时间复杂度

<=10^4 😮(n^2)
<=10^7:o(nlogn)
<=10^8:o(n)
10^8<=:o(logn),o(1)

内容

lc 455 :分发饼干 - 贪心思想
https://leetcode.cn/problems/assign-cookies/
提示:
1 <= g.length <= 3 * 10^4
0 <= s.length <= 3 * 10^4
1 <= g[i], s[j] <= 231 - 1

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        #o(nlogn)
        s.sort()
        g.sort()
        #
        i=j=0
        while i<len(s) and j<len(g):
            if s[i]>=g[j]:
                j+=1
            i+=1
        return j

lc 322 【剑指 103】【top100】:零钱兑换 - 贪心 + 回溯
https://leetcode.cn/problems/coin-change/
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4
在这里插入图片描述

#方案一:贪心失效->回溯(超时)
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        self.min_num=float('inf')
        self.dfs(coins,amount,[])
        #
        return self.min_num if self.min_num!=float('inf') else -1


    def dfs(self,coins,amount,path):
        #if amount<0:return
        if amount==0:
            self.min_num=min(self.min_num,len(path[:]))
            return
        #
        for i in range(len(coins)):
        	if amount-coins[i]<0:continue
            path.append(coins[i])
            self.dfs(coins,amount-coins[i],path)
            path.pop()
            
#方案二:回溯+贪心(超时)(不能提升性能)
#方案三:动态规划


贪心算法的特点
在这里插入图片描述
在这里插入图片描述

lc 45 :跳跃游戏 Ⅱ
https://leetcode.cn/problems/jump-game-ii/
提示:
1 <= nums.length <= 10^4
0 <= nums[i] <= 1000
在这里插入图片描述

class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums)==1:return 0
        #写法1
        steps=0
        start=end=0
        while end<len(nums)-1:
            max_pos=0
            for i in range(start,end+1):
                max_pos=max(max_pos,i+nums[i])
            #key:更新
            start=end+1
            end=max_pos
            steps+=1
        return steps

        # #写法2
        # steps=0
        # end=0
        # max_pos=0
        # for i in range(len(nums)-1):
        #     max_pos=max(max_pos,i+nums[i])
        #     #key:更新
        #     if i==end:
        #         end=max_pos
        #         steps+=1
        # return steps

lc 55 :跳跃游戏【top100】
https://leetcode.cn/problems/jump-game/
提示:
1 <= nums.length <= 3 * 10^4
0 <= nums[i] <= 10^5

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        max_pos=0
        for i in range(len(nums)):
            if max_pos<i:return False
            max_pos=max(max_pos,i+nums[i])
        return True

lc 1578 :避免重复字母的最小删除成本
https://leetcode.cn/problems/minimum-time-to-make-rope-colorful/
提示:
n == colors.length == neededTime.length
1 <= n <= 10^5
1 <= neededTime[i] <= 10^4
colors 仅由小写英文字母组成
在这里插入图片描述

class Solution:
    def minCost(self, colors: str, neededTime: List[int]) -> int:
        min_cost=0
        
        i=0
        while i<len(colors): #key:while
            max_cost=sum_cost=0
            #
            curr_color=colors[i]
            while i<len(colors) and colors[i]==curr_color:
                max_cost=max(max_cost,neededTime[i])
                sum_cost+=neededTime[i]
                i+=1
            #
            min_cost+=sum_cost-max_cost
        return min_cost

lc 402 :移掉K位数字
https://leetcode.cn/problems/remove-k-digits/
提示:
1 <= k <= num.length <= 105
num 仅由若干位数字(0 - 9)组成
除了 0 本身之外,num 不含任何前导零
在这里插入图片描述

#贪心+双端队列
class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        queue=deque()
        #
        for c in num:
            #key
            while queue and queue[-1]>c and k>0:
                queue.pop()
                k-=1
            queue.append(c)
        for i in range(k):
            queue.pop()
        #
        res=''
        is_first=True
        while queue:
            curr=queue.popleft()
            if curr=='0' and is_first:continue
            is_first=False
            res +=curr

        return res if len(res)!=0 else '0'

lc 409 :最长回文串
https://leetcode.cn/problems/longest-palindrome/
提示:
1 <= s.length <= 2000
s 只由小写 和/或 大写英文字母组成

class Solution:
    def longestPalindrome(self, s: str) -> int:
        cnt=[0]*128
        #
        for c in s:
            cnt[ord(c)]+=1
        #key
        res=0
        for v in cnt:
            res+=(v//2)*2
            if res%2==0 and v%2==1: #aaa
                res+=1
        return res

lc 680【剑指 019】:验证回文字符串 Ⅱ
https://leetcode.cn/problems/valid-palindrome-ii/
提示:
1 <= s.length <= 10^5
s 由小写英文字母组成

class Solution:
    def validPalindrome(self, s: str) -> bool:
        left=0
        right=len(s)-1
        while left<right and s[left]==s[right]:
                left+=1
                right-=1
        if left==right:return True
        return self.isvaid(s,left+1,right) or self.isvaid(s,left,right-1)
        #key:aabba
               
    def isvaid(self,s,left,right):
        while left<right:
            if s[left]!=s[right]:
                return False
            left,right=left+1,right-1
        return True

lc 316 :去除重复字母
https://leetcode.cn/problems/remove-duplicate-letters/
提示:
1 <= s.length <= 10^4
s 由小写英文字母组成
在这里插入图片描述

class Solution:
    def removeDuplicateLetters(self, s: str) -> str:
        #统计字符的最后索引
        lastIndex=[-1]*26
        for i in range(len(s)):
            lastIndex[ord(s[i])-ord('a')]=i
        #
        queue=deque()
        exist=[False]*26
        for i in range(len(s)):
            if exist[ord(s[i])-ord('a')]:continue #queue已经有
            #
            while queue and queue[-1]>s[i] and lastIndex[ord(queue[-1])-ord('a')]>i:#key:后面已经有
                c=queue.pop()
                exist[ord(c)-ord('a')]=False
            #
            queue.append(s[i])
            exist[ord(s[i])-ord('a')]=True
        # #
        res=''
        while queue:
            res+=queue.popleft()
        return res   #or:''.join(queue)

lc 1047:删除字符串中的所有相邻重复项
https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。

#方案一:栈
class Solution:
    def removeDuplicates(self, s: str) -> str:
        queue=deque()
        for c in s:
            #key:else
            if queue and queue[-1]==c:
                queue.pop()
            else:
                queue.append(c)

        return ''.join(queue)
#方案二:快慢指针
class Solution:
    def removeDuplicates(self, s: str) -> str:
        s=list(s)
        slow=-1
        fast=0
        while fast<len(s):
            if slow>=0 and s[slow]==s[fast]:
                slow-=1
            else:
                slow+=1
                s[slow]=s[fast]
            fast+=1
        return ''.join(s[:slow+1])

lc 1209 :删除字符串中的所有相邻重复项 II
https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string-ii/
提示:
1 <= s.length <= 10^5
2 <= k <= 10^4
s 中只含有小写英文字母。

在这里插入图片描述

#方案一:栈
#o(n),o(n)
class Solution:
    def removeDuplicates(self, s: str, k: int) -> str:
        stack=deque()
        for c in s:
            if not stack or c!=stack[-1][0]:
                stack.append([c,1])
            else:
                stack[-1][1]+=1
                if stack[-1][1]==k:
                    stack.pop()
        #
        res=''
        for i in range(len(stack)):
            curr=stack.popleft()
            for cnt in range(curr[1]):
                res +=curr[0]
        return res
#方案二:快慢指针
class Solution:
    def removeDuplicates(self, s: str, k: int) -> str:
        stack=deque()
        s=list(s)
        #
        slow=0
        fast=0
        while fast<len(s):
            if slow!=fast:s[slow]=s[fast]
            if slow==0 or s[slow]!=s[slow-1]:
                stack.append(1)                          
            else:
                #key
                sums=stack.pop()+1
                if sums==k:
                    slow-=k
                else:
                    stack.append(sums)
            #实际‘同时更新’
            fast+=1
            slow+=1
        return ''.join(s[0:slow])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置双网卡聚合

一 服务器多网卡聚合的意义 1、多网卡聚合&#xff0c;可以起到网络链路冗余作用&#xff0c;当故障发生时&#xff0c;网络自动切换&#xff0c;保证业务数据不中断。 2、多网卡聚合成一条虚拟链路&#xff0c;可实现网络带宽提升&#xff0c;如2个1000Mbps的网卡聚合&#…

【收藏】使用Google Colab随时随地运行Python代码

Colab官网 什么是 Colab? Colab,或“Colaboratory”,允许您在浏览器中编写和执行 Python,不需要依赖本地资源。具有以下优势: 需要零配置免费使用GPU轻松分享几大非常方便的特性: 和Google Drive无缝融合 可以将文件存储在Google Drive里面,同时也可以从Google Driv…

TiDB性能调优

文章目录一、 TiDB 常见配置优化1.1 限制 SQL 内存使用和执行时间1.1.1 执行时间限制1.1.2 内存使用限制1.2 事务重试设置1.3 Join 算子优化1.4 常见 Mysql 兼容问题1.5 其他优化项二、TiKV优化2.1 TiKV 线程池优化2.1.1 GRPC2.1.2 Scheduler2.1.3 Raftstore2.1.4 UnifyReadPoo…

对象存储服务MinIO

1. MinIO简介 对象存储的方式对比 分布式文件系统 MinIO概述: 1.MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。 2.Golang语言实现&#xff0c;配置简单&#xff0c;单行命令…

学习css3,使用代码实现一根心爱的二踢脚

2023春节快到了&#xff0c;虽然还在上班&#xff0c;但心情早已开始激动&#xff0c;感叹2022终将过去&#xff0c;喜迎2023兔年吧。让我以激动的心情&#xff0c;利用所学css3代码知识&#xff0c;实现一根心爱的二踢脚吧。 目录 1、实现思路 2、实现二踢脚的主体圆柱部分…

数据的存储(1)数据类型,整型在内存中的存储

TIPS 1. 函数递归必须存在限制条件。 2. 一维数组与二维数组在内存当中是连续存放的&#xff0c;二维数组的话反正也是一行一行往下走。如果能知道起始地址的话&#xff0c;后面顺藤摸瓜会很容易。 3. 数组越界的话&#xff0c;C语言本身是不做检查的。数组传参传的是数组首…

【跟学C++】面向对象三大特征——继承(Study20)

文章目录1、了解继承2、基类与派生类(父类与子类)2.1、概念2.2、案例展示3、构造顺序与析构顺序4、继承种类4.1、私有继承4.2、保护继承4.3、多继承5、总结 【说明】 大家好&#xff0c;本专栏主要是跟学C内容&#xff0c;自己学习了这位博主【 AI菌】的【C21天养成计划】&…

十五、类加载器、反射

类加载器 1类加载器【理解】 作用 负责将.class文件&#xff08;存储的物理文件&#xff09;加载在到内存中 2类加载的过程【理解】 类加载时机 创建类的实例&#xff08;对象&#xff09;调用类的类方法访问类或者接口的类变量&#xff0c;或者为该类变量赋值使用反射方式来…

excel制表基础:规范的制表理念和思路让效率提升 下篇

在日常工作中我们会构建很多的表格&#xff0c;其实这些表格无论多少&#xff0c;都可以归结为三大类&#xff0c;分别为“源数据表”、“关系信息表”和“统计分析表”。上次我们提到了一套表格“统计的核心”——“源数据表”&#xff0c;今天继续为大家分享“关系信息表”和…

力扣(LeetCode)1802. 有界数组中指定下标处的最大值(C++)

贪心二分查找 贪心性质&#xff1a;对于数组中确定位置index的数&#xff0c;要使nums[index]最大&#xff0c;等于使得整个数组之和最小。 提示 &#xff1a;数组相邻元素之差的绝对值小于1&#xff0c;为了数组之和最小&#xff0c;从index往左&#xff0c;形成公差为1的递减…

python实现多张多格式图片转PDF并打包成exe

目录 主要思路 转PDF初始代码 转PDF最终代码 GUI界面设计代码 打包成可执行文件 完整代码 附录 主要思路 从文件夹中读取图片数据&#xff0c;然后将他们保存为PDF格式。 转PDF初始代码 不长&#xff0c;大概10行代码。 from PIL import Image from os import *def …

Stardust 案例:制作散景光斑

本文介绍使用 Ae 插件 Stardust 制作散景光斑的一般方法与步骤。效果视频1、新建合成。持续时间&#xff1a;10 秒。2、新建纯色图层&#xff0c;命名为“散景光斑”&#xff0c;然后添加 Stardust 效果。3、设置 Emitter&#xff08;发射器&#xff09; 。用一个长方形的发射器…

2023外贸人出国抢单攻略(附带2023年全球重要展会)

自11月底以来&#xff0c;全国陆续传来政府带团出国抢单的消息&#xff0c;让沉寂了3年之久的外贸行业热情高涨。这不仅预示着3年抗疫斗争的胜利&#xff0c;更意味着中国三驾马车之一的外贸行业开启了高速运转的车轮。“浙江带领万家企业去欧洲抢单&#xff01;”“福建省商务…

少儿Python每日一题(10):手机键盘

原题解答 本次的题目如下所示(原题出处:NOC) 一般的手机的键盘是这样的: 要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。 你的任务是读取若干句只包含英文小写字母和空格的句子,求出要…

装备制造业ERP软件如何帮助企业做好物料齐套管理?

在生产制造过程中&#xff0c;要想提高生产效率&#xff0c;齐套管理是很重要的一环&#xff0c;会直接影响库存、交付和效率。而装备制造行业原料种类特别多&#xff0c;通用件也非常多&#xff0c;齐套检查工作十分复杂&#xff0c;深受以下问题困扰&#xff1a;1.装备制造业…

springmvc源码之HandlerMapping处理器映射器

系列文章目录 springmvc源码之Web上下文初始化 springmvc源码之DispatcherServlet前端控制器 springmvc源码之HandlerMapping处理器映射器 文章目录系列文章目录HandlerMapping处理器映射器实现类配置mvc:annotation-driven配置的作用RequestMappingHandlerMapping源码创建访问…

JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台,基于Spring Boot 2.7

SpringBlade微服务开发平台 完整代码下载地址:JAVA SpringBlade 微服务开发平台框架,企业级的SaaS多租户微服务平台 采用前后端分离的模式&#xff0c;前端开源两个框架&#xff1a;Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶&…

【谷粒商城基础篇】前端开发基础知识

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

Unity-ROS2与URDF导入(三)

0. 简介 在我们上一章讲的对于Unity与ROS之间的通信&#xff0c;Toolbox等比较基础的指令。下面我们将结合代码来介绍一下如何导入URDF文件&#xff0c;并通过键盘完成Unity的控制。 1. URDF模型创建 首先先创建并编辑URDF文件&#xff0c;并命名为toio_style.urdf <?x…

Python(九)Tornado web 框架

一、简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp&#xff0c;不过为了能有效利用非阻塞式服务器环境&#xff0c;这个 Web 框架还包含了一些相关有用工具及优化。 Tornado 和…