7.24 - medium总结20

375. Guess Number Higher or Lower II: minmax的一道题,一直不太会minmax的题目,大概的意思就是先选择最坏的情况,然后在一堆最坏情况里选择一个好一点的。

class Solution(object):
    def getMoneyAmount(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [[0 for _ in range(n+1)] for _ in range(n+1)]
        
        # dp[i][j] is the cost to pay for guessing range i~j
        
        for j in range(2, n+1):
            for i in range(j-1, 0, -1): # j-1 ~ 1
                min_value = sys.maxint
                for k in range(i+1, j):
                    local = k + max(dp[i][k-1], dp[k+1][j])
                    min_value = min(local, min_value)
                if j-i == 1:
                    min_value = i
                
                dp[i][j] = min_value
        
        return dp[1][n]

376. Wiggle Subsequence: 用两个dp sequence来构造,推导的时候要利用两个dp之间的关系
377. Combination Sum IV:比较像是背包问题,用target做为背包的大小,只是初始化的时候,要把dp[0]初始化为1,也就是说,当背包为0的时候,有一种放法,就是什么都不放。
378. Kth Smallest Element in a Sorted Matrix:正好是上周末九章讲的题目,思路清晰得不要不要的lol
379. Design Phone Directory: 用一个deque来做,get和release就是pop和add,然后check就是loop一遍。
380. Insert Delete GetRandom O(1):要点是O(1),所以用一个list来存数字,一个hash来记录数字的pos。
382. Linked List Random Node: 神奇的Reservoir Sampling
384. Shuffle an Array: 这又是一题关于random的题目,可以用pop任意值的方法来获取array的random permutations。
385. Mini Parser: stack的题目,有点晕晕乎乎

class Solution(object):
    def deserialize(self, s):
        """
        :type s: str
        :rtype: NestedInteger
        """
        stack, start = [], -1
        for i, c in enumerate(s):
            if c == '[':
                stack.append(NestedInteger()) # 对于每一个'['创建一个新NestedInteger,并且加入stack
            elif c == ']':
                # 如果stack里有多于一个NestedInteger,那么pop最后一个,并且把它加入到上一个中
                if len(stack) > 1:
                    t = stack.pop()
                    stack[-1].add(t)
            elif c in "1234567890-":
                if start == -1:
                    start = i
                if i == len(s) - 1 or s[i+1] not in "-1234567890": # 如果c是最后一个值或者如果i+1不是是一个数值
                    if stack:
                        stack[-1].add(NestedInteger(int(s[start:i + 1])))
                    else:
                        stack.append(NestedInteger(int(s[start:i + 1])))
                    start = -1
        return stack.pop()

386. Lexicographical Numbers:感觉这种题目只能靠死记了?

class Solution(object):
    def lexicalOrder(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        ans = [1]
        while len(ans) < n: # 如果ans的值空间小于n
            new = ans[-1] * 10 # 最新的值是ans中的最后一个值
            while new > n: # 如果新值大于n
                new /= 10 # 缩小新值
                new += 1 # 然后递增
                while new % 10 == 0:    # deal with case like 199+1=200 when we need to restart from 2.
                    new /= 10
            ans.append(new)    
        return ans

你可能感兴趣的:(7.24 - medium总结20)