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 每日一题 2022/12/19-2022/12/25 -> 正文阅读

[数据结构与算法]LeetCode 每日一题 2022/12/19-2022/12/25

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步




12/19 1971. 寻找图中是否存在路径

way[i]记录节点i可以走到的所有节点数
广搜查找是否能够从source到destination

def validPath(n, edges, source, destination):
    """
    :type n: int
    :type edges: List[List[int]]
    :type source: int
    :type destination: int
    :rtype: bool
    """
    if source==destination:
        return True
    from collections import defaultdict
    way = defaultdict(list)
    for x,y in edges:
        way[x].append(y)
        way[y].append(x)
        
    l = [source]
    mem = set()
    while l:
        tmp = []
        for node in l:
            if node in mem:
                continue
            mem.add(node)
            for nt in way[node]:
                if nt == destination:
                    return True
                if nt not in mem:
                    tmp.append(nt)
        l = tmp
    return False




12/20 1760. 袋子里最少数目的球

二分判断 每个袋子里最多为x时需要的操作次数
如果num<=x 则不需要
x<num<=2x 则需要1次 以此类推
如果此时操作次数op<=maxOperations 则可以将x减小

def minimumSize(nums, maxOperations):
    """
    :type nums: List[int]
    :type maxOperations: int
    :rtype: int
    """
    l,r = 1,max(nums)
    ans = 0
    while l<=r:
        x = (l+r)//2
        ops = sum((num-1)//x for num in nums)
        if ops<=maxOperations:
            ans = x
            r = x-1
        else:
            l = x+1
    return ans
            



12/21 1753. 移除石子的最大得分

假设a<=b<=c
如果a+b<=c 那么答案就是a+b个
如果a+b>c
首先取b,c 使得a与b相等
接着依次取a,c;b,c 取完c 此时得到c分
再取a,b 得到a-(c-(b-a))//2分

def maximumScore(a, b, c):
    """
    :type a: int
    :type b: int
    :type c: int
    :rtype: int
    """
    l = [a,b,c]
    l.sort()
    a,b,c = l[0],l[1],l[2]
    if a+b<=c:
        return a+b
    return c+a-(c-(b-a)+1)//2



12/22 1799. N 次操作后的最大分数和

gcd辗转相除获得最大公约数
g[i][j]用来存储nums[i],nums[j]的最大公约数
一共有n个数 用一个长度为n的二进制表示 数组状态
将使用的位置设置为1 一共有2^n-1种状态
一个合理的状态必定是拥有偶数个1
从小到大遍历所有状态

def maxScore(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    def gcd(a,b):
        if b==0:
            return a
        return gcd(b,a%b)
    def getone(a):
        ans = 0
        while a:
            ans += a&1
            a>>=1
        return ans
    n = len(nums)
    g = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(i+1,n):
            g[i][j] = gcd(nums[i],nums[j])
    f = [0]*(1<<n)
    for k in range(1<<n):
        cnt = getone(k)
        if cnt%2==0:
            for i in range(n):
                if k>>i &1:
                    for j in range(i+1,n):
                        if k>>j & 1:
                            f[k] = max(f[k],f[k^(1<<i)^(1<<j)]+g[i][j]*(cnt//2))
    return f[-1]
        



12/23 2011. 执行操作后的变量值

遍历 检查第2位可以判断是加还是减

def finalValueAfterOperations(operations):
    """
    :type operations: List[str]
    :rtype: int
    """
    ans = 0
    for op in operations:
        if op[1]=="+":
            ans+=1
        else:
            ans-=1
    return ans
    



12/24 1754. 构造字典序最大的合并字符串

对于word1[i] word1[j]
如果word1[i:]>word1[j:] 则将word1[i]先放入

def largestMerge(word1, word2):
    """
    :type word1: str
    :type word2: str
    :rtype: str
    """
    l=[]
    n,m=len(word1),len(word2)
    i,j=0,0
    while i<n or j<m:
        if i<n and word1[i:]>word2[j:]:
            l.append(word1[i])
            i+=1
        else:
            l.append(word2[j])
            j+=1
    return ''.join(l)



12/25 1739. 放置盒子

对第i层 可以增加i个
盒子上限为1+(1+2)+(1+2+3)+…+i(i+2)/2 = i(i+1)(i+2)/6
基础之上在增加j个

def minimumBoxes(n):
    """
    :type n: int
    :rtype: int
    """
    cur = i = j = 1
    while n>cur:
        n -= cur
        i += 1
        cur += i
    cur = 1
    while n>cur:
        n -= cur
        j += 1
        cur += 1
    return (i-1)*i//2 + j 



  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 11:33:24  更:2022-12-25 11:36:38 
 
开发: 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年11日历 -2024/11/25 14:59:50-

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