機器人的運動範圍
地上有一個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