Skip to content

Commit 84ed369

Browse files
author
aaron.liu
committed
update
1 parent bb04bdf commit 84ed369

13 files changed

+286
-0
lines changed

Array/LC163MissingRanges.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from typing import List
2+
3+
class Solution:
4+
def findMissingRanges(self, nums: List[int], lower: int, upper: int) -> List[List[int]]:
5+
res = []
6+
nums = [lower - 1] + nums + [upper + 1] # add front and end sentinels
7+
for i in range(1, len(nums)):
8+
if nums[i] - nums[i - 1] > 1:
9+
res.append([nums[i - 1] + 1, nums[i] - 1])
10+
return res
11+
12+
# meta变形:
13+
# res.append(self.getString(nums[i-1 ]+ 1, nums[i] - 1))
14+
# def getString(self, n1, n2):
15+
# if n1 == n2:
16+
# return str(n1)
17+
# else:
18+
# return str(n1) + "->" + str(n2)

Array/LC31NextPermutation.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from typing import List
2+
3+
class Solution:
4+
def nextPermutation(self, nums: List[int]) -> None:
5+
if len(nums) < 2:
6+
return
7+
8+
end_idx = len(nums) - 1
9+
while (end_idx and nums[end_idx - 1] >= nums[end_idx]):
10+
end_idx -= 1
11+
if end_idx <= 0:
12+
nums.reverse()
13+
return
14+
# 在[end_idx, end]中 找比nums[end_idx-1]大的 第一个最远的位置
15+
idx = end_idx
16+
while idx < len(nums) and nums[idx] > nums[end_idx - 1]:
17+
idx += 1
18+
nums[end_idx - 1], nums[idx - 1] = nums[idx - 1], nums[end_idx - 1]
19+
nums[end_idx:] = nums[end_idx:][::-1]

Array/LC56MergeIntervals.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import List
2+
3+
class Solution:
4+
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
5+
ret = []
6+
intervals = sorted(intervals) # sorted on first element of inner list
7+
cur_left, cur_right = intervals[0][0], intervals[0][1]
8+
for i in range(1, len(intervals)):
9+
if intervals[i][0] > cur_right:
10+
ret.append([cur_left, cur_right])
11+
cur_left, cur_right = intervals[i][0], intervals[i][1]
12+
else:
13+
cur_right = max(cur_right, intervals[i][1])
14+
ret.append([cur_left, cur_right]) # last interval needs to process outside of for loop
15+
return ret

Array/LC670MaximumSwap.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
class Solution:
3+
def maximumSwap(self, num: int) -> int:
4+
num_str = list(str(num))
5+
for i in range(len(num_str) - 1):
6+
if num_str[i] < num_str[i + 1]: # 从前往后找到第一个非递减的位置
7+
pivot = i + 1
8+
for j in range(i + 1, len(num_str)):
9+
if num_str[j] >= num_str[pivot]: # 从i+1的位置往后找最大的一个数 有相等的数且越往后越好(>=)
10+
pivot = j
11+
for k in range(i + 1): # 从[0,i]找第一个比pivot小的数 两数交换
12+
if num_str[k] < num_str[pivot]:
13+
num_str[k], num_str[pivot] = num_str[pivot], num_str[k]
14+
return int("".join(num_str)) # 注意这里的写法 --> "".join(List)
15+
return num

Array/LC766ToeplitzMatrix.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from typing import List
2+
3+
class Solution:
4+
# method 1: space o(1) compare: matrix[i][j] != matrix[i-1][j-1]
5+
def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
6+
if not matrix: return True
7+
8+
for i in range(1, len(matrix)):
9+
for j in range(1, len(matrix[0])):
10+
if matrix[i][j] != matrix[i-1][j-1]:
11+
return False
12+
return True

Array/Meta_insert_with_order.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from typing import List
2+
3+
'''
4+
有一个string list A, 里面每个string(tag)都不同. 另一个string list B是在A的基础上删掉了一些tags.
5+
给定一个tag, 该tag一定在A里出现过, 要把它加入到list B中. 要求: tags之间的相对顺序不变.
6+
7+
例子:
8+
list_A: {A B C D E F}
9+
idx_A: 0 1 2 3 4 5
10+
11+
list_B: {A C F}
12+
idx_B: 0 1 2
13+
14+
给一个tag: D, 应该插入到list_B的下标2的位置.
15+
16+
17+
思路: 二分
18+
对B进行二分下标 第一次找到1-->对应字符C 然后去array_A里看 C的位置在2 D的位置在3 所以C小了 下次二分往右半边区间找
19+
第二次找到2 -->对应字符F 再去array_A里看 F的位置在5 D的位置在3 5>3 找到了 --> 返回在F在array_B的下标2
20+
需要对A建立一个索引: {str : index} 方便来一个tag时 能快速知道他在A的下标
21+
'''
22+
23+
def insert_with_order(tagsA: List[str], tagsB: List[str], tag: str) -> int:
24+
if not tagsA or not tagsB or len(tagsB) >= len(tagsA):
25+
return -1
26+
27+
idx_dictA = {}
28+
for i in range(len(tagsA)):
29+
idx_dictA[tagsA[i]] = i
30+
31+
left, right = 0, len(tagsB) - 1
32+
while left < right:
33+
mid = (left + right) // 2
34+
cur_tag = tagsB[mid]
35+
if idx_dictA[cur_tag] > idx_dictA[tag]:
36+
right = mid
37+
else:
38+
left = mid + 1
39+
return left
40+
41+
listA = ['A', 'B', 'C', 'D', 'E', 'F']
42+
listB = ['A', 'C', 'F']
43+
44+
print(insert_with_order(listA, listB, 'D'))
45+

Array/Meta_max_add_with_self.py

Whitespace-only changes.

Array/Meta_two_sum_max.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from typing import List
2+
import sys
3+
'''
4+
给定一个nums数组 返回数组中两个元素的最大和. 要求这两个元素不能相邻.
5+
6+
思路:
7+
扫描数组nums, 记当前index为i. 维护一个i-1之前的看到过的最大数 记为tmp_max.
8+
tmp_max和当前的nums[i]求和作为备选答案 与维护的global ret进行对比.
9+
'''
10+
11+
def max_sum_of_two(nums: List[int]) -> int:
12+
if not nums or len(nums) < 3: return 0 # nums至少有三个数
13+
14+
tmp_max = max(nums[0], nums[1])
15+
ret = nums[0] + nums[2]
16+
for i in range(3, len(nums)): # 从第四个数开始看
17+
tmp_ret = tmp_max + nums[i]
18+
ret = max(ret, tmp_ret)
19+
tmp_max = max(tmp_max, nums[i - 1])
20+
return ret
21+
22+
nums = [4, 5, 102, 2]
23+
# nums = [1, 2, 3, 4, 5]
24+
print(max_sum_of_two(nums))
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import List
2+
import collections
3+
4+
class Solution:
5+
# ref: group anagram. 把根一样的group到一起 hashmap: key-> [list]
6+
# 如何group: 把所有string都转化成以a开头的string. eg, xyz->abc 先计算第一个字母和a的差值 后面diff相同. 特殊注意‘b'-diff < "a"的情况 需要把"b"+26
7+
# #python字母ord("a") = 97 取数字ord(string), 取字母chr(num)
8+
def groupStrings(self, strings: List[str]) -> List[List[str]]:
9+
dict = collections.defaultdict(list)
10+
for string in strings:
11+
key = self.getShiftedString(string)
12+
dict[key].append(string)
13+
return list(dict.values())
14+
15+
def getShiftedString(self, s):
16+
diff = ord(s[0]) - ord("a") # python字母ord("a") = 97
17+
shifted = ""
18+
for i in range(0, len(s)):
19+
# 考虑s[i]-diff<0的情况 需要套圈+26(). 因为python字母从97开始, 所以取mod, 这样所有情况都+26即可
20+
shifted += chr((ord(s[i]) + 26 - diff) % 26)
21+
return shifted
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import List
2+
3+
class Solution:
4+
# stack装ID: 还没有end的logId. 每碰到start就push+结算stack[-1]的结果, 碰到end就stack.pop()+计算结果.
5+
# res array记录每个id的时长
6+
def exclusiveTime(self, n: int, logs: List[str]) -> List[int]:
7+
ret = [0] * n
8+
stack = [] # methods being executed
9+
prev_ts = 0
10+
for log in logs:
11+
log_str = log.split(":")
12+
id, op, ts = int(log_str[0]), log_str[1], int(log_str[2])
13+
if op == "start": # calculate previous total, then push newId into stack
14+
if stack:
15+
prev_id = stack[-1]
16+
ret[prev_id] += ts - prev_ts
17+
stack.append(id)
18+
prev_ts = ts
19+
else:
20+
ret[stack[-1]] += ts - prev_ts + 1 # note +1 here
21+
stack.pop()
22+
prev_ts = ts + 1 # note +1 here
23+
return ret

0 commit comments

Comments
 (0)