LeetCode 每日一题 2024/3/4-2024/3/10

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




3/4 232. 用栈实现队列

两个栈实现
一个为入栈 一个为出栈

class MyQueue(object):

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.A,self.B=[],[]
        

    def push(self, x):
        """
        Push element x to the back of queue.
        :type x: int
        :rtype: void
        """
        self.A.append(x)
        

    def pop(self):
        """
        Removes the element from in front of queue and returns that element.
        :rtype: int
        """
        pk = self.peek()
        self.B.pop()
        return pk
        

    def peek(self):
        """
        Get the front element.
        :rtype: int
        """
        if self.B:
            return self.B[-1]
        if not self.A:
            return -1
        while self.A:
            self.B.append(self.A.pop())
        return self.B[-1]
        

    def empty(self):
        """
        Returns whether the queue is empty.
        :rtype: bool
        """
        return not self.A and not self.B



3/5 1976. 到达目的地的方案数

m[x][y]代表x,y之间的路径时间 如果没有直接路径则为无穷
dis[x]代表从0到x的路径长度
dijkstra 每次更新与邻居的最短路径 选最短的走
f[x]记录0到x点最短路径的条数

def countPaths(n, roads):
    """
    :type n: int
    :type roads: List[List[int]]
    :rtype: int
    """
    MOD = 10**9+7
    m= [[float("inf")*n] for _ in range(n)]
    for x,y,v in roads:
        m[x][y] = v
        m[y][x] = v
        
    dis=[float("inf")]*n
    dis[0]=0
    f=[0]*n
    f[0]=1
    done = [False]*n
    while True:
        x = -1
        for i,ok in enumerate(done):
            if not ok and (x<0 or dis[i]<dis[x]):
                x=i
        if x==n-1:
            return f[-1]
        done[x]=True
        dx=dis[x]
        for y,d in enumerate(m[x]):
            new = dx+d
            if new<dis[y]:
                dis[y]=new
                f[y]=f[x]
            elif new==dis[y]:
                f[y]=(f[y]+f[x])%MOD
            
        



3/6 2917. 找出数组中的 K-or 值

最多32位 枚举每一位情况

def findKOr(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    maxv = max(nums)
    ans = 0
    for i in range(32):
        if 1<<i>maxv:
            break
        cur = 0
        for num in nums:
            if num&(1<<i)>0:
                cur+=1
            if cur==k:
                ans +=(1<<i)
                break
    return ans



3/7 2575. 找出字符串的可整除数组

一次添加 增加一位 原数*10+新添加那一位的值

def divisibilityArray(word, m):
    """
    :type word: str
    :type m: int
    :rtype: List[int]
    """
    n = len(word)
    ans = [0]*n
    cur = 0
    for i,w in enumerate(word):
        cur = cur*10+int(w)
        if cur%m==0:
            ans[i]=1
        cur %=m
    return ans



3/8 2834. 找出美丽数组的最小和

为了不存在两个数相加=target 并且和尽量小
可以选1,2…target/2
从小到大选择 如果不够n个则继续添加target,target+1…

def minimumPossibleSum(n, target):
    """
    :type n: int
    :type target: int
    :rtype: int
    """
    MOD=10**9+7
    if target//2>=n:
        return (n*(n+1)/2)%MOD
    else:
        t = target//2
        ans = ((t*(t+1)/2)%MOD+(2*target+n-t-1)*(n-t)/2)%MOD
        return ans



3/9 2386. 找出数组的第 K 大和

最大的和为所有正数相加 s1
最大值情况为选取所有正数
对其进行减法
如果是正数则去除
如果是负数则加入
所以可以把所有数都取绝对值
将题目变为绝对值后数组第k个最小子序列和
二分找到limit值 使得不超过limit的元素和有k个
dfs对各个数值进行选择

def kSum(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    n=len(nums)
    s1 = 0
    s2 = 0
    for i in range(n):
        if nums[i]>=0:
            s1+=nums[i]
        else:
            nums[i]=-nums[i]
        s2+=nums[i]
    nums.sort()
    
    global cnt
    cnt = 0
    def dfs(i,t,limit):
        global cnt
        if i==n or cnt>=k-1 or t+nums[i]>limit:
            return
        cnt+=1
        dfs(i+1,t+nums[i],limit)
        dfs(i+1,t,limit)
    l,r = 0,s2
    while l<=r:
        mid=(l+r)//2
        cnt=0
        dfs(0,0,mid)
        if cnt>=k-1:
            r=mid-1
        else:
            l=mid+1
    return s1-l



3/10 299. 猜数字游戏

逐位比较
如果相同则公牛数+1
如果不同 则在两个map中分别记录字符出现次数
奶牛数即为每个字符在两个map中的较小值

def getHint(secret, guess):
    """
    :type secret: str
    :type guess: str
    :rtype: str
    """
    from collections import defaultdict
    n=len(secret)
    smap = defaultdict(int)
    gmap = defaultdict(int)
    bulls = 0
    for i in range(n):
        if secret[i]==guess[i]:
            bulls+=1
        else:
            smap[secret[i]] +=1
            gmap[guess[i]] +=1      
    cows = sum([min(smap[str(i)],gmap[str(i)]) for i in range(10)])
    ans = "{}A{}B".format(bulls,cows)
    return ans



相关推荐

  1. leetcode每日4

    2024-03-11 13:56:04       58 阅读
  2. leetcode每日37

    2024-03-11 13:56:04       55 阅读
  3. leetcode每日38

    2024-03-11 13:56:04       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 13:56:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 13:56:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 13:56:04       87 阅读
  4. Python语言-面向对象

    2024-03-11 13:56:04       96 阅读

热门阅读

  1. Python-OpenCV-边缘检测

    2024-03-11 13:56:04       39 阅读
  2. connection.query()和 connection.execute()

    2024-03-11 13:56:04       48 阅读
  3. Chromedriver安装新版本时需要先卸载旧版本么?

    2024-03-11 13:56:04       47 阅读
  4. 【Python】正则

    2024-03-11 13:56:04       50 阅读
  5. [蓝桥杯 2018 省 B] 递增三元组

    2024-03-11 13:56:04       48 阅读
  6. # 关于virt-cat命令之-c|--connect参数问题

    2024-03-11 13:56:04       50 阅读
  7. openssl3.2 - 官方demo学习 - encode - rsa_encode.c

    2024-03-11 13:56:04       42 阅读
  8. 数据标准化方法

    2024-03-11 13:56:04       44 阅读
  9. linux系统Docker容器Dockerfile示例

    2024-03-11 13:56:04       47 阅读
  10. RabbitMQ实战:docker compose 搭建RabbitMQ

    2024-03-11 13:56:04       42 阅读
  11. Neovim基本介绍

    2024-03-11 13:56:04       46 阅读
  12. 单机Kubenetes集群——KinD安装

    2024-03-11 13:56:04       47 阅读