牛客網刷題3--python

機器人的運動範圍

地上有一個m行和n列的方格。一個機器人從座標0,0的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數位之和大於k的格子。 例如,當k爲18時,機器人能夠進入方格(35,37),因爲3+5+3+7 = 18。但是,它不能進入方格(35,38),因爲3+5+3+8 = 19。請問該機器人能夠達到多少個格子?

解法

  • BFS:
  • DFS:注意對範圍的判斷
# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.res = 0
        self.vis = []
        self.dx = [-1, 0, 1, 0]
        self.dy = [0, -1, 0, 1]
        
    def get_num(self, num):
        cnt = 0
        while num > 0:
            cnt += num % 10
            num /= 10
        return cnt
    
    def movingCount(self, threshold, rows, cols, x = 0, y = 0):
        # write code here
        if threshold <= 0:
            return 0
        if x < 0 or x >= rows or y < 0 or y >= cols or (x, y) in self.vis:
            return
        if self.get_num(x) + self.get_num(y) > threshold:
            return
        
        self.res += 1
        self.vis.append((x, y))
        
        for i in range(4):
            self.movingCount(threshold, rows, cols, x + self.dx[i], y + self.dy[i])
        
        return self.res

刪掉一個元素以後全爲 1 的最長子數組

給你一個二進制數組 nums ,你需要從中刪掉一個元素。

請你在刪掉元素的結果數組中,返回最長的且只包含 1 的非空子數組的長度。

如果不存在這樣的子數組,請返回 0 。

提示 1:

輸入:nums = [1,1,0,1]
輸出:3
解釋:刪掉位置 2 的數後,[1,1,1] 包含 3 個 1 。
示例 2:

輸入:nums = [0,1,1,1,0,1,1,0,1]
輸出:5
解釋:刪掉位置 4 的數字後,[0,1,1,1,1,1,0,1] 的最長全 1 子數組爲 [1,1,1,1,1] 。
示例 3:

輸入:nums = [1,1,1]
輸出:2
解釋:你必須要刪除一個元素。
示例 4:

輸入:nums = [1,1,0,0,1,1,1,0,1]
輸出:4
示例 5:

輸入:nums = [0,0,0]
輸出:0

提示:

1 <= nums.length <= 10^5
nums[i] 要麼是 0 要麼是 1 。

class Solution(object):
    def longestSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = 0
        a, b = 0, 0
        for i, x in enumerate(nums):
            if x == 1:
                a += 1
                b += 1
                res = max(res, a)
            else:
                a = b
                b = 0
        if res == len(nums):
            res -= 1

        return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章