463. Island Perimeter

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        closeLine=0

        n=0
        sum1=0
        while n<len(grid):
            k=0
            while k<len(grid[n]):
                if grid[n][k]==1:
                    sum1+=4
                    if k>0 and grid[n][k]==grid[n][k-1]:
                        closeLine+=2
                k+=1
            q=0
            while q<len(grid[n]):
                if n>0 and grid[n][q]==1 and grid[n][q]==grid[n-1][q]:
                    closeLine+=2
                q+=1
            n+=1
         
        return sum1-closeLine
         
         
         
还算比较顺利吧,跑了两次就跑出来了,思路是正确的,果然这个题目还是个小学奥数题……貌似没怎么考算法。结果就是总陆地数量乘4减去2倍的相同边界数。
         
但是速度似乎太慢了,只击败了36%的人……虽然最快的也只比我快50%(只?!!!!???(╯‵□′)╯︵┻━┻)

最快解法:
class Solution(object): def islandPerimeter(self, grid): """ :type grid: List[List[int]] :rtype: int """ if not grid: return 0 s = 0 for i in range(len(grid)): for j in range(len(grid[i])): if grid[i][j]==1: s+=4 if i!=0: if grid[i-1][j]>0: s -=2 if j!=0: if grid[i][j-1]>0: s -=2 return s

注意学习,在循环的时候获取list索引的一种很好的写法就是,
for i in range(len(grid)),即用list的长度来生成一个新的range类.
这个解法是判断了如下几种情况:右下角的点和正上方以及正左方的点进行比较;左边缘正下方的点和正上方的点进行比较,上边缘正右方的点和正左方的点进行比较。

我的解法是,从第一行开始,正右方的点和正左方的点进行比较,然后从第一列开始,正下方的点和正上方的点进行比较,然后再继续比较第二行以及第二列,再递进。

这个答案只用到了两个变量来循环,即i和j。

但是!!!为毛我按这个最快的答案进去跑,尼玛时间和我一样啊?当然我感觉实际上也是这样,真是醉了,不知道leetcode的时间是怎么算的。。大概这道题没啥优化的余地吧,可能就看心情返回运算时间??
(然后我把我的答案又反复提交了几次,居然速度超过了60%的人……醉了)

评论

此博客中的热门博文

225 Implement Stack using Queues

232. Implement Queue using Stacks

20. Valid Parentheses