• Leetcode刷题10.21(一)——三数之和 & 长按键入


    leetcode 15 三数之和

      本题要求三数之和,难度一下子比两数之和提升不少。除了要找出符合条件的数组以外还要避免重复。主要思路:

    • 先固定一个值,再利用双指针找另外两个
    • 想要合理利用双指针,就需要对原数组进行从小到大排序,将双指针分别放在起始点后面那半数组的头和尾上
    • 利用排完序的特性,每次将三个数之和与目标值比较,大于目标值则移动右指针;小于则移动左指针
    • 在找数的过程中去重,只有在找到符合条件的数组时才需要考虑重复的情况,另外也要考虑固定值的重复情况
    • 优化:当固定值大于0时,后面必然不会再有符合条件的组合了,直接跳出
    class Solution:
        def isLongPressedName(self, name: str, typed: str) -> bool:
            if len(name) > len(typed):
                return False
            j = 0
            for i in range(len(name)):
                if name[i] != typed[j]:
                    return False
                else:
                    if j < len(typed)-1:        #注意j的边界
                        j += 1
                    if i < len(name)-1 and name[i] != name[i+1]:
                        while j > 0 and j < len(typed)-1 and typed[j] == typed[j-1]:   # 注意j的边界
                            j += 1
            for i in range(j,len(typed)):        # 注意当name遍历完但是typed还有多余非重复字符时的情况
                if typed[i] != name[-1]:
                    return False
            return True

    leetcode 925 长按键入

      此题遍历比较即可,需要注意的点是当name里本身有重复字符的时候如何处理,这里给出两种办法:

    • 第一种以name为基准,当typed中有重复字符时while跳过,除非name中下一个字符与当前字符相等,则不必跳过typed中的重复字符,直接给索引加一,直到遍历完name。此时需要另外考虑一种情况,即typed结尾有非重复的多余字符。
    class Solution:
        def isLongPressedName(self, name: str, typed: str) -> bool:
            if len(name) > len(typed):
                return False
            j = 0
            for i in range(len(name)):
                if name[i] != typed[j]:     # 如当前字符不相等,直接跳出
                    return False
                else:
                    if j < len(typed)-1:        #注意j的边界
                        j += 1
                    if i < len(name)-1 and name[i] != name[i+1]:
                        while j > 0 and j < len(typed)-1 and typed[j] == typed[j-1]:   # 注意j的边界
                            j += 1
            for i in range(j,len(typed)):        # 注意当name遍历完但是typed还有多余非重复字符时的情况
                if typed[i] != name[-1]:
                    return False
            return True
    • 另一种方法比较简洁,以typed为基准遍历,每次都同时移动两个指针,判断两个字符是否相等,如果不等,则说明有长按键入,那么只将typed遍历索引加一,最后判断name是否遍历完
    class Solution:
        def isLongPressedName(self, name: str, typed: str) -> bool:
            # 定义指针,分别指向 name 和 typed 的首字符
            n = 0
            t = 0
            # 遍历 typed 与 name 中的字符比较
            while t < len(typed):
                # 比较,相同移动指针
                if n < len(name) and name[n] == typed[t]:
                    n += 1
                    t += 1
                # 不相同时,要注意 p 指针指向的元素
                # 如果是首元素,那么表示 name 和 typed 首字符都不同,可以直接返回 False
                # 如果不在首元素,看是否键入重复,键入重复,继续移动 q 指针,继续判断;如果不重复,也就是不相等的情况,直接返回 False,表示输入错误
                elif n > 0 and name[n-1] == typed[t]:
                    t += 1
                else:
                    return False
            # typed 遍历完成后要检查 name 是否遍历完成
            return n == len(name)
  • 相关阅读:
    hdu 4324(dfs)
    hdu 2376(求树上任意两点之间距离之和的平均值)
    hdu 3665(最短路)
    hdu 4463(最小生成树变形)
    hdu 2242(边双连通分量)
    hdu 2682(最小生成树)
    hdu 2444(二分图的判断以及求最大匹配)
    陶哲轩实分析命题6.4.12
    陶哲轩实分析习题8.3.4
    CantorBernsteinSchroeder定理的证明
  • 原文地址:https://www.cnblogs.com/nekoneko-15/p/13861757.html
Copyright © 2020-2023  润新知