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 每日一题 2021/8/16-2021/8/22 -> 正文阅读

[数据结构与算法]LeetCode 每日一题 2021/8/16-2021/8/22

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




8/16 526. Beautiful Arrangement 优美的排列

回溯
store存储位置i可以放置的数 包括i的因数 以及i的倍数<=n
s记录当前可用的数字
每一个位置遍历所有可放置的数 是否可用 可用则继续下一个位置

def countArrangement(n):
    """
    :type n: int
    :rtype: int
    """
    def factors(num):
        ret = []
        for i in range(1,num//2+1):
            if num%i==0:
                ret.append(i)
        return ret
    
    store = {}
    for i in range(1,n+1):
        num = factors(i)
        tmp = i
        while tmp<=n:
            num.append(tmp)
            tmp+=i
        store[i] = num
        
    s = set(list(range(1,n+1)))
    
    
    def find(loc):
        if loc==n+1:
            return 1
        l = store[loc]
        ans = 0
        for num in l:
            if num in s:
                s.remove(num)
                ans += find(loc+1)
                s.add(num)
        return ans
    return find(1)


8/17 551. Student Attendance Record I 学生出勤记录 I

numA 记录缺勤次数
conL 记录连续迟到天数

def checkRecord(s):
    """
    :type s: str
    :rtype: bool
    """
    numA = 0
    conL = 0
    for c in s:
        if c=="L":
            conL +=1
            if conL>2:
                return False
        else:
            conL = 0
            
        if c=="A":
            numA +=1
            if numA==2:
                return False
    return True


8/18 552. Student Attendance Record II 学生出勤记录 II

1.num 当前天数
numa 缺勤天数
prel 连续迟到天数
mem记录已考虑状况
递归太深 失败
2.状态转移 dp
缺勤最多只能1次
所以可以分为a,p 分别代表缺勤一次 未缺勤
连续迟到最多可以2次 所以分为0,1,2 代表连续迟到天数
所以一共有六种状态a0,a1,a2,p0,p1,p2
p0可以由p0,p1,p2 +P转变
p1只能由p0 +L转变
p2只能由p1 +L转变
a0可以由p0,p1,p2 +A 或者a0,a1,a2 +P转变
a1只能由a0 +L转变
a2只能由a1 +L转变
循环n次将六种状态累加得到答案

def checkRecord(n):
    """
    :type n: int
    :rtype: int
    """
    MOD=10**9+7
    mem = {}
    def find(num,numa,prel):
        if (num,numa,prel) in mem:
            return mem[(num,numa,prel)]
        ans = 0
        if num==n:
            mem[(num,numa,prel)] = 1
            return 1
        if numa<1:
            ans += find(num+1,numa+1,0)%MOD
        if prel<2:
            ans += find(num+1,numa,prel+1)%MOD
        ans += find(num+1,numa,0)%MOD
        ans = ans%MOD
        mem[(num,numa,prel)] = ans
        return ans
    return find(0,0,0)

def checkRecord2(n):
    """
    :type n: int
    :rtype: int
    """
    MOD=10**9+7
    p0,p1,p2 = 1,0,0
    a0,a1,a2 = 0,0,0
    for i in range(n):
        t0,t1,t2 = p0,p1,p2
        p0,p1,p2 = (p0+p1+p2)%MOD,p0,p1
        a0,a1,a2 = (a0+a1+a2+t0+t1+t2)%MOD,a0,a1
    ans = (p0+p1+p2+a0+a1+a2)%MOD
    return ans


8/19 345. Reverse Vowels of a String 反转字符串中的元音字母

前后双指针 遇到元音字母停下 两处交换

def reverseVowels(s):
    """
    :type s: str
    :rtype: str
    """
    vowel=set(list("aoeiuAOEIU"))
    i,j=0,len(s)-1
    l = list(s)
    while i<j:
        while l[i] not in vowel:
            i+=1
            if i==j:
                return ''.join(l)
        while l[j] not in vowel:
            j-=1
            if i==j:
                return ''.join(l)
        l[i],l[j]=l[j],l[i]
        i+=1
        j-=1
    return ''.join(l)


8/20 541. Reverse String II 反转字符串 II

l,r代表需要反正的字符段左右
l需要小于s的长度 r为l+k-1和长度n-1之间的较小值
下一个l为之前r+k+1

def reverseStr(s, k):
    """
    :type s: str
    :type k: int
    :rtype: str
    """
    n = len(s)
    ls= list(s)
    l = 0
    while l<n:
        r = min(l+k-1,n-1)
        tmp = r
        while l<r:
            ls[l],ls[r]=ls[r],ls[l]
            l+=1
            r-=1
        l = tmp+k+1
    return ''.join(ls)


8/21 443. String Compression 压缩字符串

pre记录前一个字符 num记录前一个字符个数
如果字符变换 则将pre加入答案
如果num>1 则将num变为list的字符串加入

def compress(chars):
    """
    :type chars: List[str]
    :rtype: int
    """
    pre = ""
    num = 0
    ans = []
    for c in chars:
        if pre=="":
            pre = c
            num = 1
        elif pre ==c:
            num+=1
        else:
            ans.append(pre)
            if num>1:
                numl = list(str(num))
                ans.extend(numl)
            pre = c
            num = 1
    ans.append(pre)
    if num>1:
        numl = list(str(num))
        ans.extend(numl)
    ret = len(ans)
    chars[:ret] = ans[:]
    return ret


8/22 789. Escape The Ghosts 逃脱阻碍者

只要有一个阻碍者在我之前到达目的地 那么必定无法成功逃脱


def escapeGhosts(ghosts, target):
    """
    :type ghosts: List[List[int]]
    :type target: List[int]
    :rtype: bool
    """
    num = abs(target[0])+abs(target[1])
    for x,y in ghosts:
        tmp =  abs(x-target[0])+abs(y-target[1])
        if tmp<=num:
            return False
    return True

  数据结构与算法 最新文章
LeetCode 383 赎金信[数组] HERODING的Leet
matlab中fill函数的使用方法
动态规划总结篇一
LeetCode530 二叉搜索树的最小绝对差
单链表的增删改查
拓扑排序 golang实现
用栈实现队列的功能Java(leetcode)
两数相加
动态规划思路
希尔排序——C++实现
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:56:46  更:2021-08-23 16:58:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
360图书馆 购物 三丰科技 阅读网 日历 万年历 2021年12日历 -2021/12/4 20:55:33-
图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码