zoukankan      html  css  js  c++  java
  • LeetCode每周记录-4

    给出一个目标数字和一个数组,在这个数组里面找三个相加起来最接近目标数字的组合。用的方法其实和找三个数相加起来是0那道题一样,先排序,然后按顺序固定一个数,用两个指针搜索的形式,注意避免重复搜索即可。代码:

    class Solution(object):
        def threeSumClosest(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: int
            """
            totalLength = len(nums)
            if totalLength <= 3: return sum(nums)
            nums = sorted(nums)
            currClosest = sum([nums[0], nums[1], nums[-1]])
            for i in xrange(totalLength - 2):
                if i > 0 and nums[i] == nums[i - 1]: continue
                l, r = i + 1, totalLength - 1
                while(l < r):
                    sumRet = nums[i] + nums[l] + nums[r]
                    if sumRet == target:
                        return target
                    elif abs(currClosest - target) > abs(sumRet - target):
                        currClosest = sumRet
                    else:
                        if sumRet > target:
                            r -= 1
                        else:
                            l += 1
            return currClosest

    2-9的数字能代表的字母如图所示,给出一串数字号码,列出数字转换成字母后的所有可能性。题目比较简单,把所有可能性列出来即可。

    class Solution(object):
        def letterCombinations(self, digits):
            """
            :type digits: str
            :rtype: List[str]
            """
            digitToLetter = {
                '2': ['a', 'b', 'c'],
                '3': ['d', 'e', 'f'],
                '4': ['g', 'h', 'i'],
                '5': ['j', 'k', 'l'],
                '6': ['m', 'n', 'o'],
                '7': ['p', 'q', 'r', 's'],
                '8': ['t', 'u', 'v'],
                '9': ['w', 'x', 'y', 'z']
            }
            currCombinations = []
            for digit in digits:
                if digit in digitToLetter:
                    if len(currCombinations) == 0:
                        currCombinations = digitToLetter[digit]
                    else:
                        _currCombinations = []
                        for letter in digitToLetter[digit]:
                            _currCombinations += map(lambda x:x+letter, currCombinations)
                        currCombinations = _currCombinations
            return currCombinations

     3Sum的升级版,从数组里面找出所有相加为0的四个数组合。我这里沿用了3Sum的办法,固定两个数,然后两个指针从这两个数右侧的两端开始找可能性,跑下来发现时间用了很多,看了别人的解法,主要在固定两个数的时候加了几步筛选步骤,避免了两个活动指针不必要的寻找。我的代码:

    class Solution(object):
        def fourSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[List[int]]
            """
            allPossibilities = []
            totalLength = len(nums)
            if totalLength < 4: return allPossibilities
            nums = sorted(nums)
            for i in xrange(totalLength - 3):
                if i >= 1 and nums[i] == nums[i - 1]: continue  # 这里可以继续优化
                for _i in xrange(i + 1, totalLength - 2):
                    if _i > (i + 1) and nums[_i] == nums[_i - 1]: continue  # 这里可以继续优化
                    l, r = _i + 1, totalLength - 1
                    while(l < r):
                        sumRet = sum([nums[i], nums[_i], nums[l], nums[r]])
                        if sumRet == target:
                            allPossibilities.append([nums[i], nums[_i], nums[l], nums[r]])
                            l += 1
                            while(nums[l] == nums[l - 1] and l < r): l += 1
                        elif sumRet < target:
                            l += 1
                        else:
                            r -= 1
            return allPossibilities

     

    给出一个数字n和一串链表,把这个链表的倒数第n个节点删除(只能对链表进行一次遍历)。我的做法是一边遍历链表一边把链表的节点存到一个数组里面,最后根据数组的长度找到第n个节点,然后利用数组存下来的节点直接进行链表节点的切割。

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def removeNthFromEnd(self, head, n):
            """
            :type head: ListNode
            :type n: int
            :rtype: ListNode
            """
            nodeList = []
            p = head
            while(p):
                nodeList.append(p)
                p = p.next
            if n == len(nodeList):
                head = head.next
            else:
                preNode = nodeList[-(n+1)]
                preNode.next = None if n == 1 else nodeList[-(n-1)]
            return head
            

     检查给出的括号字符串是否正确(对称),利用栈可以简单的处理这道题。遇到左括号压栈,遇到右括号弹栈并检查这对括号是否匹配,不匹配直接返回False,直到字符串遍历完毕,最后栈里面是空的,则是一个正确的括号字符串。

    class Solution(object):
        def isValid(self, s):
            """
            :type s: str
            :rtype: bool
            """
            pre = ['(', '{', '[']
            suf = [')', '}', ']']
            sufToPre = {')': '(', '}': '{', ']': '['}
            q = []
            for letter in s:
                if letter in pre:
                    q.append(letter)
                elif letter in suf:
                    if q == [] or q.pop() != sufToPre[letter]:
                        return False
                else:
                    return False
            return True if q == [] else False
  • 相关阅读:
    LR通过SiteScope监控mysql
    安装apk文件报waiting for device 时解决办法
    VMware虚拟机中设置端口映射(转载)
    Android模拟器中安装APK文件(转)
    netstat监控大量ESTABLISHED连接与Time_Wait连接问题(转载)
    linux 安装sysstat使用iostat、mpstat、sar、sa(转载)
    SQL联合查询中的关键语法(转)
    JVM调优总结 -Xms -Xmx -Xmn -Xss(转载)
    JVM系列三:JVM参数设置、分析(转载)
    查找进程并杀进程的命令
  • 原文地址:https://www.cnblogs.com/HorribleMe/p/12656631.html
Copyright © 2011-2022 走看看