【日常系列】LeetCode《21·综合应用3》

news2025/1/16 13:58:30

数据规模->时间复杂度

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

内容

在这里插入图片描述

lc 217 :存在重复元素
https://leetcode.cn/problems/contains-duplicate/
提示:
1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9

在这里插入图片描述

#方案一:哈希
#o(n),o(n)
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        #写法1
        # visited=set()
        # for i in range(len(nums)):
        #     if nums[i] in visited:return True
        #     visited.add(nums[i])
        # return False
        
        #写法2
        # visited={}
        # for i in range(len(nums)):
        #     if visited.get(nums[i]):return True #if nums[i] in visited
        #     visited[nums[i]]=1
        # return False

        #写法3
        return len(nums)!=len(set(nums))

#方案二:排序
#时:o(nlogn),空:o(logn)/o(n)
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        #nums.sort()
        nums=sorted(nums)
        for i in range(1,len(nums)):
            if nums[i]==nums[i-1]:return True
        return False

lc 219 :存在重复元素 II
https://leetcode.cn/problems/contains-duplicate-ii/
提示:
1 <= nums.length <= 10^5
-109 <= nums[i] <= 10^9
0 <= k <= 10^5

在这里插入图片描述

#方案一:哈希
#o(n),o(n)
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        visited={}
        for i in range(len(nums)):
            if nums[i] in visited and i-visited[nums[i]]<=k:return True #visited.get(nums[i])等价于visited[nums[i]]
            visited[nums[i]]=i
        return False
        
#方案二:滑动窗+哈希
#时:o(n),空:o(min(n,k))
class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        left=right=0
        window=set()
        while right<len(nums):
            #
            if nums[right] in window:return True
            #
            window.add(nums[right])
            if len(window)>k:
                window.remove(nums[left])
                left+=1
            #更新窗口
            right+=1
        return False

lc 220 【剑指 057】:存在重复元素 III
https://leetcode.cn/problems/contains-duplicate-iii/
提示:
0 <= nums.length <= 2 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^4
0 <= t <= 2^31 - 1

在这里插入图片描述
注意:相邻桶也有可能存在在这里插入图片描述
注意:负数/0的情况
在这里插入图片描述

#方案一:滑动窗(位置差)+桶(数值差)
#时:o(n),o(min(n,k))
class Solution:
    def containsNearbyAlmostDuplicate(self, nums: List[int], indexDiff: int, valueDiff: int) -> bool:
        left=right=0
        #key1:保证值区间
        bucketsize=valueDiff+1 
        window_bucket={}
        while right<len(nums):
            bucketid=self.getbucketid(nums[right],bucketsize)
            #考虑单桶/相邻桶情况
            if bucketid in window_bucket:return True
            if bucketid+1 in window_bucket and window_bucket[bucketid+1]-nums[right]<=valueDiff:
                return True
            if bucketid-1 in window_bucket and nums[right]-window_bucket[bucketid-1]<=valueDiff:
                return True
            #  
            window_bucket[bucketid]=nums[right]

            #key2:保证窗口个数区间(桶的个数=min(k,n))
            if len(window_bucket)>indexDiff:
                del window_bucket[self.getbucketid(nums[left],bucketsize)]
                left+=1
            #key3:更新窗口
            right+=1
        return False

    def getbucketid(self,x,bucketsize):
        if x>:return x//bucketsize
        return ((x+1)//bucketsize)-1

lc 258 :各位相加
https://leetcode.cn/problems/add-digits/
提示:
0 <= num <= 2^31 - 1

class Solution:
    def addDigits(self, num: int) -> int:
        while num>=10:
            num=self.sumdig(num)
        return num
    
    def sumdig(self,num):
        total=0
        while num!=0:
            total+=num%10
            num//=10 #注意:不是/
        return total

lc 202 :快乐数
https://leetcode.cn/problems/happy-number/
提示:
1 <= n <= 2^31 - 1

在这里插入图片描述在这里插入图片描述

#抽象为“单向链表"是否有环问题
#方案一:哈希
class Solution:
    def isHappy(self, n: int) -> bool:
        visited=set()
        while True:
            if n==1:return True
            if n in visited:return False
            #
            visited.add(n)
            n=self.squaresum(n)

    def squaresum(self,num):
        s=0
        while num!=0:
            s+=(num%10)**2
            num//=10
        return s
        
#方案二:快慢指针
class Solution:
    def isHappy(self, n: int) -> bool:
        if n==1:return True
        #
        slow=fast=n
        while True:
            slow=self.squaresum(slow)
            fast=self.squaresum(self.squaresum(fast))
            if fast==1:return True #slow==1 or
            if slow==fast:return False
            
    def squaresum(self,num):
        s=0
        while num!=0:
            s+=(num%10)**2
            num//=10
        return s

lc 263 :丑数
https://leetcode.cn/problems/ugly-number/
提示:
-2^31 <= n <= 2^31 - 1
在这里插入图片描述在这里插入图片描述

#问题抽象为”树形结构“
#方案一:DFS
class Solution:
    def isUgly(self, n: int) -> bool:
        if n==0: return False #死循环
        return self.dfs(n)
    
    def dfs(self,n):
        if n==1:return True
        factors=[2,3,5]
        for fac in factors:
            if n%fac==0 and self.dfs(n/fac): #key:能判断出-能被整除,则对n/fac一直整除下去
                return True
        return False
#方案二:迭代
class Solution:
    def isUgly(self, n: int) -> bool:
        if n==0:return False
        factors=[2,3,5]
        for fac in factors:
            while n%fac==0:
                n/=fac
        return n==1

字典树 - 前缀树 - Tire
在这里插入图片描述

#Node:表达节点-表达单词结尾
#功能:添加单词-查询指定单词(哈希表)
class Node:
    def __init__(self):
        self.children={} #c->Node(c)
        self.isend=False #标记每个单词的结尾字符
    
class trie:
    def __init__(self):
        self.root=Node()
    
    def add(self,word):
        curr=self.root
        for c in word:
            #key
            if c not in curr.children:
                curr.children[c]=Node()
            curr=curr.children[c]
        #
        curr.isend=True

    def contain(self,word):
        curr=self.root
        for c in word:
            if c not in curr.children:
                return False
            curr=curr.children[c]
        #
        return curr.isend

lc 208 【剑指 062】:实现 Trie (前缀树)【top100】
https://leetcode.cn/problems/implement-trie-prefix-tree/
提示:
1 <= word.length, prefix.length <= 2000
word 和 prefix 仅由小写英文字母组成
insert、search 和 startsWith 调用次数 总计 不超过 3 * 10^4 次

#方案一:map
class Node:
    def __init__(self):
        self.children={}
        self.isend=False

class Trie:

    def __init__(self):
        self.root=Node()

    def insert(self, word: str) -> None:
        curr=self.root
        for c in word:
            if c not in curr.children:
                curr.children[c]=Node()
            curr=curr.children[c]
        curr.isend=True


    def search(self, word: str) -> bool:
        curr=self.root
        for c in word:
            if c not in curr.children:
                return False
            curr=curr.children[c]
        return curr.isend


    def startsWith(self, prefix: str) -> bool:
        curr=self.root
        for c in prefix:
            if c not in curr.children:
                return False
            curr=curr.children[c]
        return True #说明找到最后一个字符时,也未返回False

# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

#方案二:数组
class Node:
    def __init__(self):
        self.children=[None]*26
        self.isend=False

class Trie:

    def __init__(self):
        self.root=Node()

    def insert(self, word: str) -> None:
        curr=self.root
        for c in word:
            if curr.children[ord(c)-ord('a')]==None:
                curr.children[ord(c)-ord('a')]=Node()
            curr=curr.children[ord(c)-ord('a')]
        curr.isend=True


    def search(self, word: str) -> bool:
        curr=self.root
        for c in word:
            if curr.children[ord(c)-ord('a')]==None:
                return False
            curr=curr.children[ord(c)-ord('a')]
        return curr.isend


    def startsWith(self, prefix: str) -> bool:
        curr=self.root
        for c in prefix:
            if curr.children[ord(c)-ord('a')]==None:
                return False
            curr=curr.children[ord(c)-ord('a')]
        return True #说明找到最后一个字符时,也未返回False


# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

lc 642 :搜索自动补全系统
https://leetcode.cn/problems/design-search-autocomplete-system/
提示:
n == sentences.length
n == times.length
1 <= n <= 100
1 <= sentences[i].length <= 100
1 <= times[i] <= 50
c 是小写英文字母, ‘#’, 或空格 ’ ’
每个被测试的句子将是一个以字符 ‘#’ 结尾的字符 c 序列。
每个被测试的句子的长度范围为 [1,200]
每个输入句子中的单词用单个空格隔开。
input 最多被调用 5000 次

在这里插入图片描述
在这里插入图片描述

#①
class trieNode: #for build 前缀树
    def __init__(self):
        self.children={}
        self.end_times=0

#②
class sentenceInfo: #for matchsentences.sort
    def __init__(self,content,time):
        self.content=content
        self.time=time
#③key:如果有多条热度相同的句子,请按照 ASCII 码的顺序输出(ASCII 码越小排名越前)
class compareKey(sentenceInfo):
    def __lt__(x,y):
        return x.content<y.content if x.time == y.time else x.time>y.time


###########################
class AutocompleteSystem:
    def __init__(self, sentences: List[str], times: List[int]):
        #
        self.root=trieNode()
        for i in range(len(sentences)):
            self.insert(sentences[i],times[i])#字典树:字符串+热度
        #记录当前输入
        self.currentinput=""


    def input(self, c: str) -> List[str]:
        res=[]
        if c=="#":
            self.insert(self.currentinput, 1)#完整句子情况
            self.currentinput=""
        else:
            self.currentinput+=c #莫忘
            matchsentences=self.searchmatchs(self.currentinput)#找匹配
            matchsentences.sort(key=lambda x:(-x.time,x.content))#排个序 #???-x.time
            for i in range(min(3,len(matchsentences))):#存前三
                res.append(matchsentences[i].content)
        return res


##########################################
    #构建前缀树    
    def insert(self,s,time):
        curr=self.root
        for c in s:
            if c not in curr.children:
                curr.children[c]=trieNode()
            curr=curr.children[c]
        #key:热度可叠加
        curr.end_times+=time

    #搜索以s开头的所有句子
    def searchmatchs(self,s):
        matchs=[] #注意位置
        ##curr->指向前缀末端(比如do的o)
        curr=self.root
        for c in s:
            if c not in curr.children:
                curr.children[c]=trieNode()
            curr=curr.children[c]
        ##dfs->每个matchsentence(dog,door,does···)
        def dfs(curr,s):
            #
            if curr.end_times>0:
                matchs.append(sentenceInfo(s, curr.end_times))
            #
            for c,node in curr.children.items():#key:.items() #[c,node]也行  
                dfs(node,s+c)
            
        dfs(curr, s)
        return matchs


# Your AutocompleteSystem object will be instantiated and called as such:
# obj = AutocompleteSystem(sentences, times)
# param_1 = obj.input(c)

lc 421【剑指 067】 :数组中两个数的最大异或值
https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/
提示:
1 <= nums.length <= 2 * 10^5
0 <= nums[i] <= 2^31 - 1

在这里插入图片描述

在这里插入图片描述

#二进制前缀树
class Node:
    def __init__(self):
        self.zero=None
        self.one=None

#o(30)->o(1)
class Trie:
    def __init__(self):
        self.root=Node()
    
    #不断添加,构造前缀树
    def add(self,num):
        curr=self.root
        #从左往右取二进制位
        for k in range(30,-1,-1):
            bit=(num>>k)&1
            if bit==0:
                if not curr.zero:
                    curr.zero=Node()
                curr=curr.zero
            else:
                if not curr.one:
                    curr.one=Node()
                curr=curr.one

    
    #不断在树中,查询最大异或值
    def maxXor(self,num):
        #
        x=0
        curr=self.root
        for k in range(30,-1,-1):
            bit=(num>>k)&1
            #key
            if bit==0:
                if curr.one!=None:
                    curr=curr.one
                    x=2*x +1
                else:
                    curr=curr.zero
                    x=2*x
            else:
                if curr.zero!=None:
                    curr=curr.zero
                    x=2*x +1
                else:
                    curr=curr.one
                    x=2*x
        return x
                         
#O(n),o(n)
class Solution:
    def findMaximumXOR(self, nums: List[int]) -> int:
        #
        res=0
        trie=Trie()
        #
        for i in range(1,len(nums)):
            trie.add(nums[i-1])
            res=max(res,trie.maxXor(nums[i]))
        return res

lc 440 :字典序的第K小数字
https://leetcode.cn/problems/k-th-smallest-in-lexicographical-order/
提示:
1 <= k <= n <= 10^9
在这里插入图片描述

#抽象为十叉树
class Solution:
    def findKthNumber(self, n: int, k: int) -> int:
        curr=1
        k-=1 #key?
        #
        while k>0:
            nums=self.calnodes(n,curr,curr+1)
            if nums-1 <k: #不在当前curr前缀树
                curr +=1 #去‘下一树’
                k -=nums
            else:#在当前curr前缀树
                #去‘下一层’
                curr *=10 
                k-=1
        return curr


    #计算当前curr“前缀树”中(小于n)的总节点数
    def calnodes(self,n,curr,next):
        nums=0
        while curr<=n:
            nums+=min(n+1,next)-curr
            #去“下一层”
            curr *=10
            next *=10
        return nums

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

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

相关文章

Python基础教程(2)——列表、元组、字典、集合、斐波纳契数列、end 关键字、条件控制、循环语句

1.列表 &#xff08;1&#xff09;删除列表的元素 list [Google, Runoob, 1997, 2000] print ("原始列表 : ", list) del list[2] print ("删除第三个元素 : ", list)&#xff08;2&#xff09;Python列表脚本操作符 &#xff08;3&#xff09;嵌套列表…

Arco 属性

文章目录Arco介绍1. 简介1.1 背景1.2 运行环境1.3 浏览器兼容性2. 设计价值观2.1 清晰2.2 一致2.3 韵律2.4 开放3. 设计原则3.1 及时反馈3.2 贴近现实3.3 系统一致性3.4 防止错误发生3.5 遵从习惯3.6 突出重点3.7 错误帮助3.8 人性化帮助4. 界面总体风格4.1 页面风格4.1.1 主色…

知识答题小程序如何制作_分享微信答题抽奖小程序制作步骤

知识答题小程序如何制作&#xff1f;现在越来越多的企业和组织逐步进行各种获奖知识问答小程序。那么&#xff0c;如何制作一个答题小程序呢&#xff1f;今天&#xff0c;我们一起来看看~需要的老板不要走开哦~既然点进来了&#xff0c;那就请各位老板耐心看到最后吧~怎么做一个…

JDBC如何破坏双亲委派机制

JDBC的注册会涉及到java spi机制&#xff0c;即Service Provideer Interface&#xff0c;主要应用于厂商自定义组件或插件中&#xff1b;简单说就是java来定义接口规则和方法&#xff0c;厂商实现具体逻辑&#xff0c;每家厂商根据自己产品实现的逻辑肯定不相同&#xff0c;但上…

数据库查询语句-详细篇

今天来梳理一下数据库的一些查询语句&#xff0c;做软件/移动端/电脑端&#xff0c;开发程序时必然离不开数据库的设计以及查询&#xff1b; 一&#xff1a;具体的代码如下展示&#xff1a; 1.查询数据库指定表的所有信息 select * from uploadimagecode;2.查询当前数据表部…

说说PPT的“只读模式”和“限制编辑”有何区别

对PPT的内容进行保护&#xff0c;使其不能随意编辑&#xff0c;防止意外更改&#xff0c;我们可以将PPT设置成无法编辑、无法改动的“保护模式”。 设置“保护模式”&#xff0c;一般我们都会想到【限制编辑】模式&#xff0c;但在设置的时候&#xff0c;会发现PPT里&#xff…

毕业半年年终总结

毕业半年年终总结 如果说2021年主要的内容是求职和实习 那么2022年一年主要的内容便是毕业和工作 匆匆忙忙 本科毕业了 6月份的时候参加完毕业答辩&#xff0c;也就顺利的毕业了 实际上中途也有过一些插曲&#xff0c;比如毕业设计是制作某某管理系统&#xff0c;基本上所有…

【Java编程进阶】流程控制结构详解

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. 流程控制结构2. 顺序结构3. 分支结构3.1 单分支3.2 双分支3.3 多分支 (if-else)3.4 嵌套 if3.5 多分支结构 (switch)4. 循环结构4.1 for 循环4.2 while 循环4.3 do...while循环5. 流程跳转5.1 break5.2 …

【数据结构】优先级队列(堆)

成功就是失败到失败&#xff0c;也丝毫不减当初的热情 目录 1.理解优先级队列 2.优先级队列的底层 2.1 认识堆 2.1.1 堆的概念 2.2.2 堆的存储 2.2 堆的创建 2.2.1 向下调整算法 2.2.2 堆的创建 2.3 堆的插入 2.4 堆的删除 2.5 查看堆顶元素 2.6 堆的运用 3…

windows 11 安装jdk1.8

1.先去JDK官网下载 JDK1.8官网 2.进入到官网之后 3. 点击上图windows选项       按照你的电脑是32位还是64位按需下载(我电脑是64位) 4. 点击下载之后就会跳转到Oracle账号登录界面&#xff08;没有Oracle账号的注册一下这边我就省略了注册了&#xff09; 5.把下载好的…

商业智能BI财务分析,如何从财务指标定位到业务问题

商业智能BI开发人员都会思考如何从财务指标定位到业务问题&#xff0c;就是做了很多的商业智能BI开发&#xff0c;每次也都涉及到了财务分析&#xff0c;各种财务能力指标&#xff0c;各种可视化的分析图表。但是不知道这些财务指标到底能够反映出企业的什么问题&#xff0c;和…

蓝桥杯Python练习题3-十六进制转八进制

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n &#xff08;1<n<10&am…

Weston 纹理倒置(render-gl)

纹理倒置 背景 在 render-gl 接入 frame buffer object 实现 off-screen 渲染后,发现得到的渲染图发生了180的倒置. 查阅了有关资料后,在 eglspec.1.5 中的 2.2.2.1 Native Surface Coordinate Systems 找到了答案: The coordinate system for native windows and pixmaps …

2023届毕业生职场第一步:挡飞刀

这篇博客不会教你某一段代码怎么写&#xff0c;某一个知识点怎么入门&#xff0c;但却可以让你在2023年的职场上&#xff0c;躲避飞刀。 目录 1、啥是挡飞刀 2、其他知名大厂也好不到哪里去 3、 毕业生如何躲飞刀&#xff1f; 4、毕业生首选什么样的公司 5、不建议去这样的…

工具学习——ubuntu轻量桌面对比

因为最近要做一些ubuntu上的开发&#xff0c;然后使用ssh问题是经常会出现中断&#xff0c;虽然可以使用等tmux方法来挂起进程&#xff0c;但是感觉不如界面方便&#xff0c;然后现在问题来了&#xff0c;我的ubuntu服务器是一个双核的性能很差内存也少的机器&#xff0c;我怎么…

13-Golang中for循环的用法

Golang中for循环的用法for循环基本语法for循环流程图注意事项和使用细节for循环 就是让一段代码循环的执行。 基本语法 for循环变量初始化&#xff1b;循环条件&#xff1b;循环变量迭代{循环操作(语句)}package main import "fmt"func main(){for i : 1; i < …

C#,谷歌(Google)CityHash64与CityHash128散列哈希算法的C#源程序

1、CityHash简史 Google 2011年发布了 CityHash 系列字符串散列算法 。今天发布的有两种算法&#xff1a;CityHash64 与 CityHash128 。它们分别根据字串计算 64 和 128 位的散列值。这些算法不适用于加密&#xff0c;但适合用在散列表等处。 Google 一直在根据其数据中心常…

“刀片嗓”“水泥鼻”“咳出肺”可以这样缓解!

很多人感染新冠后&#xff0c;咽痛、鼻塞、干咳和其他不适&#xff0c;非常不舒服&#xff0c;在网上讨论也总结了“刀片嗓”、“水泥鼻”、“咳出肺”三个字生动地展现了他们的不适。今天&#xff0c;对于这三种症状&#xff0c;今天就为大家带来一些缓解的小方法。 病症一&am…

机器学习中的评价指标

1.MSE&#xff08;mean squared error&#xff09; 叫做均方误差&#xff0c;又称L2损失。取平方有一个特性&#xff0c;它惩罚更大的错误更多&#xff08;毕竟都取平方了&#xff09;。方差一般用来计算样本的离散程度&#xff0c;而均方误差则可以用做衡量模型拟合的一个度量…

Linux串口编程详解(阻塞模式、非阻塞模式、select函数)

前言&#xff1a;之前一直觉得串口编程很简单&#xff0c;这两天仔细研究后发现串口里的各种参数还挺复杂&#xff0c;稍不注意就容易出错&#xff0c;这里总结一下网上的各种文章及自己的理解与实践。 open 函数 功能描述&#xff1a;用于打开或创建文件&#xff0c;成功则返…