力扣每日一题(五十七——广(深)度优先遍历算法(关二维平面搜索问题))

仅以此纪录每日LeetCode所刷题目。

题目描述:

示例:

 

思路:

这道题需要同时使用BFS + DFS,因为题目中已经明确说明图中含有两座岛,因此我们首先使用DFS搜索出其中的任意一座岛屿,将这座岛屿的坐标放在一个队列中,下一步我们使用BFS,一个格子一个格子的向外扩充,如果某次碰到了另外一个岛屿,则返回对应的step即可。

代码:

class Solution:
    def shortestBridge(self, grid: List[List[int]]) -> int:
        def dfs(i,j):
            if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0 or grid[i][j] == 2:
                return 
            else:
                grid[i][j] = 2
                q.append((i,j))
                for x,y in dirs:
                    new_x = x+i
                    new_y = y+j
                    dfs(new_x,new_y)
        def bfs(i,j):
            steps = 0
            while q:
                size = len(q)
                for _ in range(size):
                    i,j = q.popleft()
                    for x,y in dirs:
                        new_x = i + x
                        new_y = j + y
                        if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 2:
                            continue
                        if grid[new_x][new_y] == 1:
                            return steps
                        grid[new_x][new_y] = 2
                        q.append((new_x,new_y))
                steps += 1
        q = collections.deque()
        dirs = ((-1,0),(1,0),(0,-1),(0,1))
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    dfs(i,j)
                    return bfs(i,j)

 题目描述:

示例:

 

思路:

这道题相当于求岛屿的面积之和,首先我们要将不是岛屿的陆地(该岛屿的陆地在给出地图的边界上)赋值成0,来方便我们后续的计算,这一步我们使用BFS,从地图的四周出发,完成赋值,之后我们遍历地图,找到为1的陆地面积之和即可。

代码:

class Solution:
    def numEnclaves(self, grid: List[List[int]]) -> int:
        def bfs(x,y):
            grid[x][y] = 0
            for i,j in dirs:
                new_x = x + i
                new_y = y + j
                if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 2:
                    continue
                if grid[new_x][new_y] == 1:
                    bfs(new_x,new_y)
            return 
        dirs = ((1,0),(-1,0),(0,1),(0,-1))
        for i in range(len(grid)):
            if grid[i][0] == 1:
                bfs(i,0)
        for i in range(len(grid[0])):
            if grid[0][i] == 1:
                bfs(0,i)
        for i in range(len(grid)):
            if grid[i][len(grid[0])-1] == 1:
                bfs(i,len(grid[0])-1)
        for i in range(len(grid[0])):
            if grid[len(grid)-1][i] == 1:
                bfs(len(grid)-1,i)
        count = 0
        for k in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[k][j] == 1:
                    count += 1
        return count

 题目描述:

示例:思路:

这道题和上一题(飞地的数量)思路大体相同,本题我们使用BFS将不是岛屿的陆地(该岛屿的陆地在给出地图的边界上)赋值成1,之后使用DFS来求陆地的数量。

代码:

class Solution:
    def closedIsland(self, grid: List[List[int]]) -> int:
        def bfs(x,y):
            grid[x][y] = 1
            for i,j in dirs:
                new_x = x + i
                new_y = y + j
                if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 1:
                    continue
                else:
                    bfs(new_x,new_y)
            return 
        def dfs(x,y,grid):
            grid[x][y] = 1
            if x < len(grid) - 1 and grid[x+1][y] == 0:
                dfs(x+1,y,grid)
            if y < len(grid[0]) - 1 and grid[x][y+1] == 0:
                dfs(x,y+1,grid)
            if x > 0 and grid[x-1][y] == 0:
                dfs(x-1,y,grid)
            if y > 0 and grid[x][y-1] == 0:
                dfs(x,y-1,grid)
            return 0
        dirs = ((1,0),(-1,0),(0,1),(0,-1))
        for i in range(len(grid)):
            if grid[i][0] == 0:
                bfs(i,0)
        for i in range(len(grid[0])):
            if grid[0][i] == 0:
                bfs(0,i)
        for i in range(len(grid)):
            if grid[i][len(grid[0])-1] == 0:
                bfs(i,len(grid[0])-1)
        for i in range(len(grid[0])):
            if grid[len(grid)-1][i] == 0:
                bfs(len(grid)-1,i)
        count = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 0:
                    count += 1
                    dfs(i,j,grid)
        return count

 题目描述:

示例:

 

代码:

class RandomizedSet:

    def __init__(self):
        self.nums = []
        self.idx_map = dict()

    def insert(self, val: int) -> bool:
        if val not in self.idx_map:
            self.idx_map[val] = len(self.nums)
            self.nums.append(val)
            return True
        return False

    def remove(self, val: int) -> bool:
        if val in self.idx_map:
            swap_val, idx = self.nums[-1], self.idx_map[val]
            self.nums[idx] = swap_val
            self.idx_map[swap_val] = idx
            del self.idx_map[val]
            self.nums.pop()
            return True
        return False

    def getRandom(self) -> int:
        return choice(self.nums)

题目描述:

示例:

 

代码:

class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 0
        res = 0
        a = sum(nums)
        for i in range(len(nums)):
            res += i * nums[i]
        max_res = res
        a = a - nums[-1]
        for j in range(len(nums)-1):
            res = res - (len(nums)-1)*(nums[len(nums)-1-j]) + a
            max_res = max(max_res,res)
            a = a - nums[len(nums)-2-j] + nums[len(nums)-1-j]
        return max_res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值