文章目录
- 前言
- 一、最长递增区间
- 二、狄杰斯特拉(80)
- 三、K树(0)
- 总结
前言
很显然,Python的受众远远大于C++,其实笔者本人对Python的理解也是远强于C++的,C++纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行假装的。
因职业原因,Python更适用于运维、网络、AI方向,所以用得很多。最近假装职业码农装过头了,写点Python代码都习惯性加 ; 了,更离谱的是CSDN对笔者的能力判断中,C++一个劲地涨,Python都连能力都没了…
所以以后也要用Python来解解题,经常锻炼一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、最长递增区间
题目描述:
给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行输入整数n。 第二行输入n个整数。
输出描述:
输出最长递增的区间长度。
示例:
输入
6
5 2 3 8 1 9
输出
3
代码如下(示例):
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, arr):
result = 0
# TODO: 请在此编写代码
tmp = 1
for i in range(n):
if i+1 < n and arr[i+1] > arr[i]:
tmp += 1
else:
result = tmp if tmp > result else result
tmp = 1
return result
if __name__ == "__main__":
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, arr)
print(result)
非常简单,没什么好解释的,C++也做过。一样的思路。result = tmp if tmp > result else result
这行是if… else的省略写法。
二、狄杰斯特拉(80)
先申明:我也只解出80分。这题明显有点问题,示例都是错的,不能不让我怀疑测试数据是不是也有问题。我遇到好几次了,python和C++都没解出来100,当然思路是一样的。有看到满分的请给我个链接,去学习一下。先谢!
代码如下(示例):
class Solution:
def __init__(self) -> None:
self.max_dist = int(2e10)
def solution(self, n, m, s, vector):
result = self.max_dist
# TODO: 请在此编写代码
arr = [[self.max_dist for _ in range(n+1)] for _ in range(n+1)]
for v in vector:
arr[int(v[0])][int(v[1])] = int(v[2])
pathed = [False for _ in range(n+1)]
dist = [self.max_dist for _ in range(n+1)]
prev = [-1 for _ in range(n+1)]
for i in range(1, n+1):
tmp = arr[s][i]
if tmp < self.max_dist:
dist[i] = tmp
prev[i] = s
dist[s] = 0
pathed[s] = True
node = s
for i in range(1, n+1):
tmp = self.max_dist
for j in range(1, n+1):
if not pathed[j] and dist[j] < tmp:
node = j
tmp = dist[j]
pathed[node] = True
for k in range(n+1):
val = arr[node][k]
if not pathed[k] and val < self.max_dist:
new_dist = dist[node] + val
if new_dist < dist[k]:
dist[k] = new_dist
prev[k] = node
result = (dist[n] if dist[n] < self.max_dist else "INF")
return result
if __name__ == "__main__":
arr_temp = [int(item) for item in input().strip().split()]
n = int(arr_temp[0])
m = int(arr_temp[1])
s = int(arr_temp[2])
vector = []
for i in range(m):
vector.append([int(item) for item in input().strip().split()])
sol = Solution()
result = sol.solution(n, m, s, vector)
print(result)
反正没全通过,就不解释了,也不写C++版本的详解了。等我搞明白了再来改吧~嗯代码也有点长,懒得解释。
三、K树(0)
题目描述:
存在一棵包含n个节点的树。 每个节点都存在自己的颜色编号col[i]。 当两个相邻的节点a,b合并成一种a或者b时花费为col[a]+col[b]。 当我们将所有的节点都变为同一种颜色时,最小花费是?
输入描述:
第一行输入一个整数n。(1<=n<=1e6) 第二行输入节点的颜色编号 以下n-1行描述n条边.保证是节点连接成树。
输出描述:
输出最长递增的区间长度。
示例:
输入
6
5 2 3 8 1 9
输出
3
不会!
嗯,不是我不会k树(Kruskal最小生成树),深度优先搜索(Depth First Search)也是会的。这题有严重的问题,根本没给出col[i]参数!
而且就算给出参数我也不会,这应该不光是深度搜索的问题,Dijkstra才算中等难度,深度优先搜索在图论算法中,是一个级别的。题目描述问题有几个:
1、缺少col[i] 参数
2、如果有col[i],col[i]这个值会不会重复,就是颜色会不会重复,如果不会重复那倒简单了,深度优先搜索就行了。如果会重复,真心不会!
总结
不总结了,太菜!不会的太多,继续好好学习去了~ 老了也要学习!