Zhuanli&Blog


  • 首页

  • 标签

  • 分类

  • 归档

leetcode 224. 基本计算器

发表于 2018-09-11 | 分类于 leetcode

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。

示例 1:

输入: "1 + 1"
输出: 2

示例 2:

输入: " 2-1 + 2 "
输出: 3

示例 3:

输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def calculate(self, s):
total = 0
i, signs = 0, [1, 1]
while i < len(s):
c = s[i]
if c.isdigit():
start = i
while i < len(s) and s[i].isdigit():
i += 1
total += signs.pop() * int(s[start:i])
continue
if c in '+-(':
signs += [signs[-1] * (1, -1)[c == '-']]
elif c == ')':
signs.pop()
i += 1
return total

leetcode 223. 矩形面积

发表于 2018-09-10 | 分类于 leetcode

在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。

每个矩形由其左下顶点和右上顶点坐标表示,如图所示。

rectangle_area.png

示例:

输入: -3, 0, 3, 4, 0, -1, 9, 2 输出: 45

说明: 假设矩形面积不会超出 int 的范围。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def computeArea(self, A, B, C, D, E, F, G, H):
"""
:type A: int
:type B: int
:type C: int
:type D: int
:type E: int
:type F: int
:type G: int
:type H: int
:rtype: int
"""

left_x = max(A,E)
left_y = max(B,F)
right_x = min(C,G)
right_y = min(D,H)
mixed_area = (right_y-left_y)*(right_x-left_x)
if C <= E or D <= F or A >= G or B >= H:
mixed_area = 0
return (G-E)*(H-F)+(C-A)*(D-B)-mixed_area

leetcode 222. 完全二叉树的节点个数

发表于 2018-09-10 | 分类于 leetcode

给出一个完全二叉树,求出该树的节点个数。

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution:
def height(self,node):
return -1 if not node else 1 + self.height(node.left)

def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
h = self.height(root)
if h < 0:return 0
elif self.height(root.right) == h-1:
return (1<<h) + self.countNodes(root.right)
else:
return (1<<(h-1)) + self.countNodes(root.left)

leetcode 221. 最大正方形

发表于 2018-09-10 | 分类于 leetcode

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入: 
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution(object):
def maximalSquare(self, matrix):
if not matrix or not matrix[0]: return 0
m , n = len(matrix), len(matrix[0])
dp = [[ 0 if matrix[i][j] == '0' else 1 for j in range(0, n)] for i in range(0, m)]

for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == '1':
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
else:
dp[i][j] = 0
res = max(max(row) for row in dp)
return res ** 2

leetcode 220. 存在重复元素 III

发表于 2018-09-07 | 分类于 leetcode

给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。

示例 1:

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true

示例 2:

输入: nums = [1,0,1,1], k = 1, t = 2
输出: true

示例 3:

输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import collections
class Solution:

def containsNearbyAlmostDuplicate(self, nums, k, t):
if k < 1 or t < 0:
return False
dic = collections.OrderedDict()
for n in nums:
key = n if not t else n // t
for m in (dic.get(key - 1), dic.get(key), dic.get(key + 1)):
if m is not None and abs(n - m) <= t:
return True
if len(dic) == k:
dic.popitem(False)
dic[key] = n
return False

leetcode 218. 天际线问题

发表于 2018-09-07 | 分类于 leetcode

城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)。


buildings
buildings2

Buildings Skyline Contour

每个建筑物的几何信息用三元组[Li,Ri,Hi]表示,其中 Li 和 Ri 分别是第 i 座建筑物左右边缘的 x 坐标,Hi 是其高度。可以保证 0 ≤ Li, Ri ≤ INT_MAX, 0 < Hi ≤ INT_MAX 和 Ri - Li > 0。您可以假设所有建筑物都是在绝对平坦且高度为 0 的表面上的完美矩形。

例如,图A中所有建筑物的尺寸记录为:[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] 。

输出是以[ [x1,y1], [x2, y2], [x3, y3], ... ]格式的“关键点”(图B中的红点)的列表,它们唯一地定义了天际线。关键点是水平线段的左端点。请注意,最右侧建筑物的最后一个关键点仅用于标记天际线的终点,并始终为零高度。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。

例如,图B中的天际线应该表示为:[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ]。

说明:

  • 任何输入列表中的建筑物数量保证在 [0, 10000] 范围内。
  • 输入列表已经按升序排列在左边的 x 位置 Li 。
  • 输出列表必须按 x 位排序。
  • 输出天际线中不得有连续的相同高度的水平线。例如 […[2 3], [4 5], [7 5], [11 5], [12 7]…] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[…[2 3], [4 5], [12 7], …]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from heapq import heappop,heappush

class Solution:
def getSkyline(self, buildings):
"""
:type buildings: List[List[int]]
:rtype: List[List[int]]
"""
position = sorted(set([building[0] for building in buildings] + [building[1] for building in buildings]))
print(position)
ptr, prevH = 0, 0
alive, ret = [], []

for curPos in position:
while alive and alive[0][1] <= curPos:
heappop(alive)

while ptr < len(buildings) and buildings[ptr][0] <= curPos:
heappush(alive, [-buildings[ptr][2], buildings[ptr][1]])
ptr += 1

if alive:
curH = -alive[0][0]
if curH != prevH:
ret.append([curPos, curH])
prevH = curH
else:
ret.append([curPos, 0])

return ret

leetcode 216. 组合总和 III

发表于 2018-08-27 | 分类于 leetcode

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
res = []
def dfs(res,tmp,idx,sum1):
if len(tmp) == k:
if sum1 == n:
res += [tmp]
else:
return
if len(tmp) > k:return

for i in range(idx,10):
dfs(res,tmp+[i],i+1,sum1+i)

dfs(res,[],1,0)
return res

leetcode 215.Kth Largest Element in an Array

发表于 2018-08-27 | 分类于 leetcode

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

Example 1:

Input: [3,2,1,5,6,4] and k = 2
Output: 5
Example 2:

Input: [3,2,3,1,2,4,5,5,6] and k = 4
Output: 4

1
2
3
4
5
6
7
8
9
class Solution:
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
nums.sort(reverse=True)
return nums[k-1]

leetcode 214. 最短回文串

发表于 2018-08-27 | 分类于 leetcode

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: "aacecaaa"
输出: "aaacecaaa"

示例 2:

输入: "abcd"
输出: "dcbabcd"
1
2
3
4
5
6
7
8
9
10
class Solution:
def shortestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
r=s[::-1]
for i in range(len(s)+1):
if s.startswith(r[i:]):
return r[:i]+s

leetcode 212. 单词搜索 II

发表于 2018-08-22 | 分类于 leetcode

给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例:

输入: 
words = ["oath","pea","eat","rain"] and board =
[
  ['o','a','a','n'],
  ['e','t','a','e'],
  ['i','h','k','r'],
  ['i','f','l','v']
]

输出: ["eat","oath"]
说明:
你可以假设所有输入都由小写字母 a-z 组成。

提示:

  • 你需要优化回溯算法以通过更大数据量的测试。你能否早点停止回溯?
  • 如果当前单词不存在于所有单词的前缀中,则可以立即停止回溯。什么样的数据结构可以有效地执行这样的操作?散列表是否可行?为什么? 前缀树如何?如果你想学习如何实现一个基本的前缀树,请先查看这个问题: 实现Trie(前缀树)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution:
def findWords(self, board, words):
"""
:type board: List[List[str]]
:type words: List[str]
:rtype: List[str]
"""
dictionary = {}
for i in words:
d = dictionary
for j in i:
if j not in d:
d[j] = {}
d = d[j]
d[1] = True
w = len(board[0])
h = len(board)
res = []
def dfs(i, j, d, prefix):
if 1 in d and prefix not in res:
res.append(prefix)
visited[i][j] = True
if i+1 < h:
if not visited[i+1][j] and board[i+1][j] in d:
dfs(i+1, j, d[board[i+1][j]], prefix+board[i+1][j])
visited[i+1][j] = False
if i-1 >= 0:
if not visited[i-1][j] and board[i-1][j] in d:
dfs(i-1, j, d[board[i-1][j]], prefix+board[i-1][j])
visited[i-1][j] = False
if j+1 < w:
if not visited[i][j+1] and board[i][j+1] in d:
dfs(i, j+1, d[board[i][j+1]], prefix+board[i][j+1])
visited[i][j+1] = False
if j-1 >= 0:
if not visited[i][j-1] and board[i][j-1] in d:
dfs(i, j-1, d[board[i][j-1]], prefix+board[i][j-1])
visited[i][j-1] = False

for i in range(h):
for j in range(w):
visited = [[False for j in range(w)] for i in range(h)]
if board[i][j] in dictionary:
dfs(i, j, dictionary[board[i][j]], board[i][j])

return res
1…567…20

zhuanli

194 日志
9 分类
41 标签
GitHub
© 2018 — 2019 zhuanli
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4