Python每日一练:最长递增区间&狄杰斯特拉(80分)&K树(0分)

文章介绍了Python与C++编程中涉及的算法问题,包括最长递增区间的解题思路,解释了Dijkstra算法的实现,并讨论了K树问题及其在解决颜色合并最小花费时的挑战。作者指出题目存在的问题,并表示将继续学习提升。
摘要由CSDN通过智能技术生成


前言

很显然,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]这个值会不会重复,就是颜色会不会重复,如果不会重复那倒简单了,深度优先搜索就行了。如果会重复,真心不会!


总结

不总结了,太菜!不会的太多,继续好好学习去了~ 老了也要学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无证的攻城狮

如本文对您有用,大爷给打个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值