Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
5a66437
784 尝试回溯递归和非递归循环解决
lection Jun 24, 2019
9da6d8e
78 回溯 循环78 回溯 循环78 回溯 循环78 回溯 循环78 回溯 循环78 回溯 循环78 回溯 循环78 回溯 循环78 回溯…
lection Jun 24, 2019
838217b
48 77
lection Jun 25, 2019
2b31362
51 基本实现 位操作的大秀实现以后再说……51 基本实现 位操作的大秀实现以后再说……51 基本实现 位操作的大秀实现以后再说……51 …
lection Jun 25, 2019
1f4b746
240 似乎找到点儿分治的感觉了
lection Jun 25, 2019
64aed02
53 分治 + dp + 失败方案
lection Jun 26, 2019
f56c3c5
169
lection Jun 26, 2019
4ad4f7f
720 但效率很差
lection Jun 28, 2019
7e60a19
720 更多的实现
lection Jun 29, 2019
ecd51b2
208
lection Jun 29, 2019
894ff95
211
lection Jun 30, 2019
da20446
优化211
lection Jun 30, 2019
27dc685
汗,题号写错了
lection Jul 1, 2019
9b86fd1
198 小偷问题 dfs方案
lection Jul 2, 2019
35f87a1
优化dfs代码
lection Jul 3, 2019
66ee39a
70 198 补充递推玩法
lection Jul 6, 2019
0c5f18c
309 暴力完成准备优化
lection Jul 9, 2019
3e01e9a
309 完成递归+缓存
lection Jul 9, 2019
bdcece2
309 增加 dp
lection Jul 9, 2019
d39dbfc
完成dp版本
lection Jul 10, 2019
f303004
309 优化缓存占用
lection Jul 10, 2019
1f0da43
309 数组改成元组 进一步节约内存
lection Jul 10, 2019
a351d40
309 增加炫耀性日志
lection Jul 10, 2019
eae4c7b
188 股票dp 暴力实现
lection Jul 11, 2019
b865606
188 用了极其丑陋的代码勉强通过
lection Jul 11, 2019
438542c
188 勉强通过 dp
lection Jul 11, 2019
eeb1ab5
188 增加非dp的解法,但是失败了
lection Jul 12, 2019
9709b75
188 优化失败版本 依然失败
lection Jul 16, 2019
c6919b0
213 递归+缓存解法
lection Jul 16, 2019
7278ebd
213 四状态dp实现
lection Jul 16, 2019
9c1d2af
337几乎完美的答案 打败100%
lection Jul 17, 2019
b09b091
62 63 递归 + dp
lection Jul 18, 2019
d0f2cb3
120 递归与dp
lection Jul 22, 2019
7087f0a
322 递归+cache
lection Jul 22, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions Week_03/id_3/dfs/LeetCode_127_3_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ def ladderLength(self, begin, end, word_list) -> int:
begin_queue = [begin]
end_queue = [end]

while True:
if not begin_queue and not end_queue:
return 0
while begin_queue or end_queue:
if count % 2 == 0:
queue = begin_queue
cur_set, target_set = begin_set, end_set
Expand Down Expand Up @@ -56,6 +54,6 @@ def ladderLength(self, begin, end, word_list) -> int:


s = Solution()
# print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"]))
# print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot"]))
print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"]))
print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot"]))
print(s.ladderLength("hot", "dog", ["hot", "dog"]))
31 changes: 31 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_46_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
全排列 O(n^n) 似乎没啥悬念
====== 但是我居然没通过
两点问题
1 递归的退出条件不能忘了return
2 set在迭代到时候要小心插入和删除,还是list复制一份更为稳妥
"""


class Solution:
def permute(self, nums):
results = []
if not nums:
return results
self.recursion([], set(nums), results)
return results

def recursion(self, curr, num_set, results):
if len(num_set) == 0:
results.append(curr)
return

for n in list(num_set):
num_set.remove(n)
self.recursion(curr + [n], num_set, results)
num_set.add(n)


s = Solution()
print(s.permute([1, 2, 3]))
print(s.permute([6, 2, -1, 8]))
45 changes: 45 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_51_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""
最原始回溯解决n皇后方法
每一行判断是否可行,对角线方向用set可以简易实现
"""


class Solution:
def solveNQueens(self, n):
results = []
if n == 0:
return []
self.recursion(n, [], [0]*n, set(), set(), results)
return results

def recursion(self, n, curr, dis_col, dis_pie, dis_na, results):
row = len(curr) - 1
if n == (row + 1):
results.append(curr)
return
for i in range(n):
if dis_col[i] == 1:
continue
pie = i + row
if pie in dis_pie:
continue
na = i - row
if na in dis_na:
continue

line = ['.'] * n
line[i] = 'Q'

dis_col[i] = 1
dis_pie.add(pie)
dis_na.add(na)

self.recursion(n, curr + [''.join(line)], dis_col, dis_pie, dis_na, results)

dis_col[i] = 0
dis_pie.remove(pie)
dis_na.remove(na)


s = Solution()
print(s.solveNQueens(4))
25 changes: 25 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_77_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""
全组合 避免重复元素出现
使用下标过滤掉已经组合过的是一个常用的技巧
"""


class Solution:
def combine(self, n, k):
results = []
if n == 0:
return results
self.recursion([], 1, n+1, k, results)
return results

def recursion(self, curr, index, n, k, results):
if len(curr) == k:
results.append(curr)
return

for i in range(index, n):
self.recursion(curr + [i], i + 1, n, k, results)


s = Solution()
print(s.combine(4, 2))
25 changes: 25 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_784_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Solution:
def letterCasePermutation(self, ss):
results = []
if not ss:
return results
self.recursion(ss, 0, [], results)
return results

def recursion(self, ss, i, curr_arr, results):
if i == len(ss):
results.append(''.join(curr_arr))
return

c = ss[i]
self.recursion(ss, i + 1, curr_arr + [c], results)
if c.isupper():
self.recursion(ss, i + 1, curr_arr + [c.lower()], results)
elif c.islower():
self.recursion(ss, i + 1, curr_arr + [c.upper()], results)


s = Solution()
print(s.letterCasePermutation('a1b2'))
print(s.letterCasePermutation('3z4'))
print(s.letterCasePermutation('12345'))
28 changes: 28 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_784_3_v2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""
尝试非递归解决
"""


class Solution:
def letterCasePermutation(self, ss):
if not ss:
return []

results = ['']
for c in ss:
_results = []
for r in results:
if c.islower() or c.isupper():
_results.append(r + c.upper())
_results.append(r + c.lower())
else:
_results.append(r + c)

results = _results
return results


s = Solution()
print(s.letterCasePermutation('a1b2'))
print(s.letterCasePermutation('3z4'))
print(s.letterCasePermutation('12345'))
23 changes: 23 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_78_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
经典全组合
"""


class Solution:
def subsets(self, nums):
results = []
if not nums:
return results
self.recursion([], nums, results)
return results

def recursion(self, cur, nums, results):
results.append(cur)
if not nums:
return
for i in range(len(nums)):
self.recursion(cur + [nums[i]], nums[i+1:], results)


s = Solution()
print(s.subsets([1, 2, 3]))
17 changes: 17 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_78_3_v2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""
经典全组合 直接调用库函数 其实为了点进去看看他的实现代码
"""
import itertools


class Solution:
def subsets(self, nums):
results = []
for i in range(len(nums) + 1):
for r in itertools.combinations(nums, i):
results.append(list(r))
return results


s = Solution()
print(s.subsets([1, 2, 3]))
19 changes: 19 additions & 0 deletions Week_04/id_3/backtracking/LeetCode_78_3_v3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""
经典全组合 非递归
"""
import itertools


class Solution:
def subsets(self, nums):
results = [[]]
for n in nums:
_results = []
for pn in results:
_results.append(pn + [n])
results += _results
return results


s = Solution()
print(s.subsets([1, 2, 3]))
65 changes: 65 additions & 0 deletions Week_04/id_3/division/LeetCode_169_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""
既然是分治专题的,那么估计用hash的玩法是没啥意义了
看答案 分治有点儿勉强 算是学习个思路吧
O(nlogn)

似乎分治总会比暴力要好,只要从n^2变成nlogn,如果找不到最优的O(n),那么先用nlogn也不错。
"""


class Solution:
def majorityElement(self, nums):
if not nums:
return None
# return self._division1(nums)
return self._division2(nums, 0, len(nums) - 1)

def _division1(self, nums):
if len(nums) == 1:
return nums[0]

mid = len(nums) // 2
left = self._division1(nums[:mid])
right = self._division1(nums[mid:])
if left == right:
return left

lc = 0
rc = 0
for n in nums:
if n == left:
lc += 1
continue
if n == right:
rc += 1
continue
return left if lc > rc else right

def _division2(self, nums, low, high):
if low == high:
return nums[low]

mid = low + (high-low)//2
left = self._division2(nums, low, mid)
right = self._division2(nums, mid+1, high)

if left == right:
return left

lc = 0
rc = 0
for i in range(low, high+1):
n = nums[i]
if left == n:
lc += 1
continue
if right == n:
rc += 1
continue

return left if lc > rc else right


s = Solution()
# print(s.majorityElement([2, 2, 1, 1, 1, 2, 2]))
print(s.majorityElement([3, 3, 4]))
23 changes: 23 additions & 0 deletions Week_04/id_3/division/LeetCode_169_3_v2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
似乎是最优解 时间O(n) 空间O(1)
投票法
假设一个数是众数 在遍历过程中遇到该数则投票+1,不是该数则-1。
如果票数为0,则从新开始投票,并将下一个数设为架设众数。
因为众数多于一半,所以最终一定会耗尽其他数的票数并最终占有票数
"""


class Solution:
def majorityElement(self, nums):
vote = 0
for n in nums:
if vote == 0:
result = n
vote += 1
continue
if result == n:
vote += 1
else:
vote -= 1

return result
46 changes: 46 additions & 0 deletions Week_04/id_3/division/LeetCode_240_3_v1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""
一时没太想到分治咋整,先按我最朴素的思路试试。
行列都是升序,只要分别在行列中找到小于等于目标值的下标,然后访问判断即可。
====我想错了 还是换回分治琢磨琢磨

我懂了,目前的思路是,尝试把矩阵先分成2份, 先行后列,每份最大值和最小值都容易确定。然后分治并剪除不符合要求的矩阵
"""


class Solution:
def searchMatrix(self, matrix, target):
if not matrix or not matrix[0]:
return False
return self.division(matrix, target)

def division(self, matrix, target):
if not matrix or not matrix[0]:
return False

if matrix[0][0] == target:
return True

rows = len(matrix)
cols = len(matrix[0])
if matrix[0][0] > target or target > matrix[rows-1][cols-1]:
return False

if rows > 1:
index = rows//2
return self.division(matrix[:index], target) or self.division(matrix[index:], target)
else:
index = cols//2
return self.division([matrix[0][:index]], target) or self.division([matrix[0][index:]], target)


s = Solution()
matrix = [
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

print(s.searchMatrix(matrix, 5))
print(s.searchMatrix(matrix, 20))
Loading