GG Easy

1 Island Perimeter

这道题我一年过后再来写,居然被当年的算法震惊了。大概思想就是如果我们找到一个1,那么我们就从这个1从4个方向开始DFS。

在dfs任何一个点的时候,如果没有上下左右哪个方向上没有1,那就说明这个方向是其中的一条边,那么我们就对边+1.

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid or not grid[0]:
            return 0

        self.cnt = 0
        visited = set()

        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    visited.add((i, j))
                    self.helper(i, j, visited, grid)
                    return self.cnt
        return self.cnt


    def helper(self, x, y, visited, grid):
        for d, p in [(-1, 0), (1, 0), (0, 1), (0, -1)]:
            i, j = x+d, y+p
            if 0<=i<len(grid) and 0<=j<len(grid[0]) and grid[i][j]==1:
                if (i, j) not in visited:
                    visited.add((i, j))
                    self.helper(i, j, visited, grid)
            else:
                self.cnt += 1

2 Longest Uncommon Subsequence II

这道题真是神经病题目。大概思想就是,我把string按照他们的length sort一遍,然后从长到短一个个去判定,一旦找到一个string不是其他的subsequence。那么这个就是我要找的Longest subsequence。

class Solution(object):
    def findLUSlength(self, strs):
        """
        :type strs: List[str]
        :rtype: int
        """
        strs.sort(key = len, reverse = True)
        for i in range(len(strs)):
            if all(not self.isSubSeq(strs[i], strs[j]) for j in range(len(strs)) if i!=j):
                return len(strs[i])
        return -1


    def isSubSeq(self, w1, w2):
        if len(w1)>len(w2):
            return False
        index = 0
        for c in w2:
            if index<len(w1) and c == w1[index] :
                index += 1
        return index == len(w1)

3 Max Consecutive Ones II

这道题主要是最多出现过一个0,所以我们直接用两个pointer就行了。如果碰到第二个零的时候,就把start pointer更新到前一个0的后一位。连续的0的情况也能自动被handle。

class Solution(object):
    def findMaxConsecutiveOnes(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        pos = None
        start = 0
        res = 0
        for i, val in enumerate(nums):
            if val == 1:
                res = max(res, i-start + 1)
            else:
                if pos is None:
                    pos = i
                    res = max(res, i-start + 1)
                else:
                    start = pos+1
                    pos = i
        return res

s = Solution()
print s.findMaxConsecutiveOnes([0, 0])

4 Find All Numbers Disappeared in an Array

这道题有点像find missing number。不过方法很巧妙,大概思想就是loop一遍list, 如果碰到一个数为n,然后我们就把这个array第n-1位的数翻转为负数。其实就是不浪费额外内存来把这个数字表示出来。最后再扫一遍处理后的array, 如果第i位的数字不是负的话。那么久说明这个index+1的数字没有出现过。因为怕重复翻转的情况,所以每次翻转数字都加abs再加负号。

class Solution(object):
    def findDisappearedNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums:
            return []

        for num in nums:
            index = abs(num)-1
            nums[index] = -abs(nums[index])

        return [i+1 for i, num in enumerate(nums) if num>0]

5 Minimum Absolute Difference in BST

这道题目非常有意思。主要思想是我们每访问一个点的时候,我们想要知道这个点跟比他小的那个数,和比它大的那个数的距离是多少。所以跟Validate Binary Search Tree这道题的思想特别想,我们在递归的时候,就同时把这个相应node的left bound和right bound给传递下去。这样我们在traversal这个tree的时候就能够得到最短距离了。

class Solution(object):
    def getMinimumDifference(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return -1
        self.res = 1<<31
        self.helper(root)
        return self.res


    def helper(self, root, left=-(1<<31 + 1), right=1<<31):
        if not root:
            return

        self.res = min([self.res, abs(left-root.val), abs(right-root.val)])

        if root.left:
            self.helper(root.left, left, root.val)
        if root.right:
            self.helper(root.right, root.val, right)

6 Binary Watch

我觉得这道题的难度应该至少到medium啊。其实不是很好写,两种方法:第一种方法:生成所有的时间,然后判断bit加起来是不是等于给的bit数。比较暴力,不过很好写。第二种方法:把给的bit数分配到各个位上来生成时间,有点像permutation的思想。需要一个dfs的helper function。如果要避免duplication其实不是很好写。需要把两个结合起来公用一个index。看我的代码就知道了。

class Solution(object):
    def readBinaryWatch(self, num):
        """
        :type num: int
        :rtype: List[str]
        """
        res = []
        self.dfs(num, 0, 0, res, 0)
        return res

    def dfs(self, n, h, m, res, index):

        if not n:
            if m<60 and h<12:
                res.append(str(h)+':'+"0"*(m < 10)+str(m))
            return

        for i in range(index, 10):
            if i<4:
                self.dfs(n-1, h|(1<<i), m, res, i+1)
            else:
                offset = i-4
                self.dfs(n-1, h, m|(1<<offset), res, i+1)

results matching ""

    No results matching ""