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/10/10-2022/10/16 -> 正文阅读

[数据结构与算法]LeetCode 每日一题 2022/10/10-2022/10/16

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




10/10 801. 使序列递增的最小交换次数

dp
只能相同位置交换
所以对于位置i 必定满足
nums1[i]>nums1[i-1] nums2[i]>nums2[i-1] 或者
nums1[i]>nums2[i-1] nums2[i]>nums1[i-1] 此时需要交换i位置
设dp[i][0]为不交换i位置满足条件的最小次数 dp[i][1]为交换i位置的最小次数
如果仅满足条件1 则i位置情况与前一位置相同
dp[i][0] = dp[i-1][0] dp[i][1] = dp[i-1][1]+1
如果仅满足条件2 则需要交换一次
dp[i][0] = dp[i-1][1] dp[i][1] = dp[i-1][0]+1
如果同事满足1,2 则找最小次数
dp[i][0] = min(dp[i-1][0],dp[i-1][1]) dp[i][1] = min(dp[i-1][0],dp[i-1][1])+1

def minSwap(nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: int
    """
    n = len(nums1)
    dp0,dp1 = 0,1
    for i in range(1,n):
        t1 = nums1[i]>nums1[i-1] and nums2[i]>nums2[i-1]
        t2 = nums1[i]>nums2[i-1] and nums2[i]>nums1[i-1]
        if t1 and t2:
            dp0,dp1 = min(dp0,dp1),min(dp0,dp1)+1
        elif t1:
            dp0,dp1 = dp0,dp1+1
        else:
            dp0,dp1 = dp1,dp0+1
    return min(dp0,dp1)



10/11 1790. 仅执行一次字符串交换能否使两个字符串相等

排序两个字符串 如果不同必定不可
从头遍历 如果差异大于2个及不可

def areAlmostEqual(s1, s2):
    """
    :type s1: str
    :type s2: str
    :rtype: bool
    """
    if sorted(list(s1))!=sorted(list(s2)):
        return False
    diff = 0
    for i in range(len(s1)):
        if s1[i]!=s2[i]:
            diff+=1
        if diff>2:
            return False
    return True



10/12 817. 链表组件

将nums放入hash表中
遍历链表 判断是否在hash表中


class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def numComponents(head, nums):
    """
    :type head: ListNode
    :type nums: List[int]
    :rtype: int
    """
    m = {}
    for num in nums:
        m[num]=1
    ans = 0
    has = False
    while head:
        if head.val in m:
            if not has:
                ans +=1
            has = True
        else:
            has = False
        head = head.next
    return ans


10/13 769. 最多能完成排序的块

数组内每个数都不一样 排序后arr[i]=i
如果arr[0~x]间的最大值为x 则说明这个范围内可以排序成与最后结果相同
如果arr[0~x] max=x arr[0~y] max=y y>x 则arr[0~y] 可以分割为[0x],[x+1y]
所以只要判断有多少个max(arr[0~i]) = i即可

def maxChunksToSorted(arr):
    """
    :type arr: List[int]
    :rtype: int
    """
    ans = 0
    mx = 0
    for i,x in enumerate(arr):
        mx=max(mx,x)
        if mx==i:
            ans +=1
    return ans



10/14 940. 不同的子序列 II

动态规划 dp[i] 代表以s[i]结尾的子序列数目
如果a<b s[a]=s[b] 则dp[a],dp[b]会存在重复的子序列
但是dp[a]必定是dp[b]的真子集 只要将dp[a]中的s[a]变为s[b]及全部包含进了dp[b]
所以对于dp[i]只要记录[0~i-1]间的最近的不同字符dp
res[025]分别记录az最近的位置

def distinctSubseqII(s):
    """
    :type s: str
    :rtype: int
    """
    res = [-1]*26
    MOD = 10**9+7
    n= len(s)
    dp = [1]*n
    for i,c in enumerate(s):
        for j in range(26):
            if res[j]!=-1:
                dp[i] = (dp[i]+dp[res[j]])%MOD
        res[ord(s[i])-ord('a')] = i
        
    ans = 0
    for i in range(26):
        if res[i]!=-1:
            ans = (ans+dp[res[i]])%MOD
    return ans



10/15 441. 用栈操作构建数组

遍历target 如果当前数值i<target[loc] 则push,pop
一直到i=target[loc] push,loc+1

def buildArray(target, n):
    """
    :type target: List[int]
    :type n: int
    :rtype: List[str]
    """
    loc = 0
    i = 1
    ans = []
    while loc<len(target):
        ans.append("Push")
        if target[loc]>i:
            ans.append("Pop")
        else:
            loc+=1
        i+=1
    return ans



10/16 886. 可能的二分法

统计dis[x] = [] 代表x不喜欢的人
group[n] 用来标记每一个人属于哪个组 1或-1
遍历每一个人 如果当前人没有被分组 则将其分到1组
遍历其不喜欢得人 如果该人已经分组判断是否相同 如果相同则失败
否则 将其分到另外一组

def possibleBipartition(n, dislikes):
    """
    :type n: int
    :type dislikes: List[List[int]]
    :rtype: bool
    """
    dis = [[] for _ in range(n)]
    for x,y in dislikes:
        dis[x-1].append(y-1)
        dis[y-1].append(x-1)
    group = [0]*n
    for i,c in enumerate(group):
        if c==0:
            l = [i]
            group[i]=1
            while l:
                tmp = []
                for x in l:
                    for y in dis[x]:
                        if group[x]==group[y]:
                            return False
                        if group[y] == 0:
                            group[y] = -group[x]
                            tmp.append(y)
                l = tmp
    return True



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

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