LeetCode 每日一题 2023/7/24-2023/7/30

这篇具有很好参考价值的文章主要介绍了LeetCode 每日一题 2023/7/24-2023/7/30。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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




7/24 771. 宝石与石头

将宝石类型放入set中
一次判断石头中宝石个数

def numJewelsInStones(jewels, stones):
    """
    :type jewels: str
    :type stones: str
    :rtype: int
    """
    j = set(jewels)
    ans = 0
    for s in stones:
        if s in j:
            ans+=1
    return ans



7/25 2208. 将数组和减半的最少操作次数

大顶堆记录当前最大值 每次取最大值减半

def halveArray(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    import heapq
    target = sum(nums)*1.0/2
    
    l = []
    for num in nums:
        heapq.heappush(l,-num)
        
    cur = 0
    ans = 0
    while True:
        v = -heapq.heappop(l)
        cur +=v*1.0/2
        ans+=1
        if cur>=target:
            break
        heapq.heappush(l,-v*1.0/2)
    return ans



7/26 2569. 更新数组后处理求和查询

操作1是将nums1中[l,r]的数反转
操作2是将nums2的和加上p*sum(nums1)
操作3是求nums2的和
只要考虑nums1的变化即可
线段树维护nums1区间
l,r左右端点 s区间和 lazy懒标记

class Node:
    def __init__(self):
        self.l=self.r=0
        self.s = 0
        self.lazy = 0
class SegmentTree:
    def __init__(self,nums):
        self.nums = nums
        n = len(nums)
        self.tr = [Node() for _ in range(n<<2)]
        self.build(1,1,n)
    
    def build(self,u,l,r):
        self.tr[u].l,self.tr[u].r=l,r
        if l==r:
            self.tr[u].s = self.nums[l-1]
            return
        mid = (l+r)>>1
        self.build(u<<1,l,mid)
        self.build(u<<1|1,mid+1,r)
        self.pushup(u)
    
    def modify(self,u,l,r):
        if self.tr[u].l>=l and self.tr[u].r<=r:
            self.tr[u].lazy^=1
            self.tr[u].s = self.tr[u].r-self.tr[u].l+1-self.tr[u].s
            return
        self.pushdown(u)
        mid = (self.tr[u].l+self.tr[u].r)>>1
        if l<=mid:
            self.modify(u<<1,l,r)
        if r>mid:
            self.modify(u<<1|1,l,r)
        self.pushup(u)
        
    def query(self,u,l,r):
        if self.tr[u].l>=l and self.tr[u].r<=r:
            return self.tr[u].s
        self.pushdown(u)
        mid = (self.tr[u].l+self.tr[u].r)>>1
        ans = 0
        if l<=mid:
            ans +=self.query(u<<1,l,r)
        if r>mid:
            ans +=self.query(u<<1|1,l,r)
        return ans
    
    def pushup(self,u):
        self.tr[u].s = self.tr[u<<1].s+self.tr[u<<1|1].s
    
    def pushdown(self,u):
        if self.tr[u].lazy:
            mid = (self.tr[u].l+self.tr[u].r)>>1
            self.tr[u<<1].s = mid-self.tr[u].l+1-self.tr[u<<1].s
            self.tr[u<<1].lazy^=1
            self.tr[u<<1|1].s = self.tr[u].r-mid-self.tr[u<<1|1].s
            self.tr[u<<1|1].lazy^=1
            self.tr[u].lazy^=1
            
def handleQuery(nums1, nums2, queries):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :type queries: List[List[int]]
    :rtype: List[int]
    """
    tr = SegmentTree(nums1)
    s = sum(nums2)
    ans = []
    for op,l,r in queries:
        if op==1:
            tr.modify(1,l+1,r+1)
        elif op==2:
            s+=l*tr.query(1,1,len(nums1))
        else:
            ans.append(s)
    return ans



7/27 2500. 删除每行中的最大值

每一行从小到大排序
再取每一列的最大值

def deleteGreatestValue(grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    """
    cur =[]
    for l in grid:
        cur.append(sorted(l))
    return sum([max([cur[i][j] for i in range(len(cur))]) for j in range(len(grid[0]))])




7/28 2050. 并行课程 III

m[i]记录课程i为多少课程的前置课程
ind[i]记录课程i有几个前置课程
t[i]记录课程i的最早完成时间

def minimumTime(n, relations, time):
    """
    :type n: int
    :type relations: List[List[int]]
    :type time: List[int]
    :rtype: int
    """
    from collections import defaultdict
    m = defaultdict(list)
    ind=[0]*n
    for pre,nxt in relations:
        m[pre-1].append(nxt-1)
        ind[nxt-1]+=1
    l = []
    t=[0]*n
    ans = 0
    for i in range(n):
        if ind[i]==0:
            l.append(i)
            t[i]=time[i]
            ans = max(ans,t[i])
    while l:
        tmp = []
        for i in l:
            for j in m[i]:
                t[j] = max(t[j],t[i]+time[j])
                ans = max(ans,t[j])
                ind[j]-=1
                if ind[j]==0:
                    tmp.append(j)
        l=tmp
    return ans



7/29 141. 环形链表

快慢指针

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
def hasCycle(head):
    """
    :type head: ListNode
    :rtype: bool
    """
    if head==None or head.next==None:
        return False
    slow = head
    fast = head.next
    
    while(slow!=fast):
        if fast==None or fast.next==None:
            return False
        slow=slow.next
        fast=fast.next.next
    return True



7/30 142. 环形链表 II

快慢指针文章来源地址https://www.toymoban.com/news/detail-614540.html

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None
def detectCycle(head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    if head==None:
        return head
    node = ListNode()
    node.next = head
    fast,slow=node,node
    while fast==node or fast!=slow:
        slow = slow.next
        if fast.next==None or fast.next.next==None:
            return None
        fast = fast.next.next
    fast = node
    while fast!=slow:
        fast = fast.next
        slow = slow.next
    return slow



到了这里,关于LeetCode 每日一题 2023/7/24-2023/7/30的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

    目录 1267. 统计参与通信的服务器 题目描述: 实现代码与解析: 写法一:两次遍历 + hash 原理思路: 写法二:三次遍历 原理思路:         这里有一幅服务器分布图,服务器的位置标识在  m * n  的整数矩阵网格  grid  中,1 表示单元格上有服务器,0 表示没有。 如果两

    2024年02月11日
    浏览(39)
  • (链表) 剑指 Offer 24. 反转链表 ——【Leetcode每日一题】

    难度:简单 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入 : 1-2-3-4-5-NULL 输出 : 5-4-3-2-1-NULL 限制 : 0 = 节点个数 = 5000 注意:本题与 206. 反转链表 相同。 💡思路: 法一:递归 可以将本问题分解成子问题: 1 - (剩余部分的反转)

    2024年02月15日
    浏览(49)
  • 【LeetCode - 每日一题】1654. 到家的最少跳跃次数(23.08.30)

    可以左跳可以右跳 不能连续左跳两次 不能跳到负数 不能跳到 forbidden[] 求可以跳到 x 的最少跳跃次数 a. overview 最初时,只有 0 位置可以进行跳跃;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 ab );然后又多了两个位置(或者一个位置)可以跳跃…因此这是一个

    2024年02月10日
    浏览(47)
  • LeetCode 每日一题 2023/8/14-2023/8/20

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 8/14 617. 合并二叉树 dfs深搜 8/15 833. 字符串中的查找与替换 op存放该位置能替换的数值 从头遍历每个位置 8/16 2682. 找出转圈游戏输家 模拟 8/17 1444. 切披萨的方案数 动态规划 dp[k][i][j] 表

    2024年02月12日
    浏览(49)
  • LeetCode 每日一题 2023/9/25-2023/10/1

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 9/25 460. LFU 缓存 freqMap 以频率为索引 存放一个双向链表 每个节点存放key,value,freq keyMap 以key为索引存放在freqMap中的位置 9/26 2582. 递枕头 n个人 经过2n-2次回到开始的人 9/27 1333. 餐厅过滤

    2024年02月07日
    浏览(31)
  • LeetCode 每日一题 2023/7/10-2023/7/16

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 7/10 16. 最接近的三数之和 排序 先确定一个最小数 双指针确定之后两个数 7/11 1911. 最大子序列交替和 dp dp[i][0/1] 表示第i个数坐标为偶数或奇数的最大交替和 dp[i][0]=max(dp[i-1][0],dp[i-1][1

    2024年02月16日
    浏览(50)
  • LeetCode 每日一题 2023/8/7-2023/8/13

    记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 8/7 344. 反转字符串 双指针 8/8 1749. 任意子数组和的绝对值的最大值 记录最小值 最大值 8/9 1281. 整数的各位积和之差 按要求计算 8/10 1289. 下降路径最小和 II 从上到下遍历每一行 在每一

    2024年02月13日
    浏览(50)
  • 2023-05-21 LeetCode每日一题(蓄水)

    LCP 33. 蓄水 点击跳转到题目位置 给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作: 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1 蓄水:将全部水桶接满水,倒入各自对应的水缸

    2024年02月05日
    浏览(42)
  • 2023-08-27 LeetCode每日一题(合并区间)

    点击跳转到题目位置 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 示例 2: 提示: 1 = intervals.length = 10 4 intervals[i].length == 2 0 = s

    2024年02月10日
    浏览(48)
  • 2023-08-28 LeetCode每日一题(插入区间)

    点击跳转到题目位置 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 提示: 0 = intervals.length = 10 4 interval

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包