算法工程师14——力扣刷题

六大思想

八大算法基础思想_h21396577548的博客-CSDN博客_八大算法思想详解
https://blog.csdn.net/h21396577548/article/details/109481334?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%85%AB%E5%A4%A7%E7%AE%97%E6%B3%95%E6%80%9D%E6%83%B3&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-109481334.nonecase&spm=1018.2226.3001.4187

(1)递归

(2)枚举

增加记忆数组

(3)动态优化

(4)贪心

(5)分治

(6)回溯

1 概述

1.1 刷题技巧

(1)有一个提纲,轮廓
(2)做一些重点笔记,把典型题型总结一下
(3)做一些复习
(4)跟好的代码学习
(5)相似的题目一起做,由易到难,一系列内容一起做,每个系列做10多道就可以了,最后做热题

1.2 刷题顺序

1 先把数据结构与算法的基本题做了32个:
(32条消息) 算法工程师15——数据结构与算法加强版_xiaotiig的博客-CSDN博客
https://blog.csdn.net/xiaotiig/article/details/120721639

2 牛客网:剑指offer

3 牛客网的上周考过

4 力扣top面试题
力扣top100

5 力扣中的几种题型

5.1 路径最短

5.2 股票买卖

5.3 排列组合

2 基本的输入输出

2.1 牛客网的OJ题联系

联系输入输出:https://www.nowcoder.com/test/27976983/summary

# 1 读取一行
sys.stdin.readline()  
# 2 读取剩下所有行,这个有时候会出错
sys.stdin.readlines()
# 3 读取一行,以回车键为标记
 a = input()
 b, c = a.split(' ')
# 4 strip删去首尾指定字符串https://www.runoob.com/python/att-string-strip.html
# 不放参数默认删除空格和换行符
注意:该方法只能删除开头或是结尾的字符或字符串,不能删除中间部分的字符。
str = "00000003210Runoob01230000000"; 
print str.strip( '0' );  # 去除首尾字符 0
# 5 安指定字符分割.split(),默认以空格和\n,或\n
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
print str.split( );       # 以空格为分隔符,包含 \n
print str.split(' ', 1 ); # 以空格为分隔符,分隔成两个
输出
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
# 6 将一行输入分割并转换为数字类型
for _ in range(n):
    a,b = list(map(int,input().strip().split()))# 一定要加list
    print(a+b)

2.2 案例1

while True:
    try:
        a = input()
        b, c = a.split(' ')
        print(int(b) + int(c))
    except:
        break
import sys
lines = sys.stdin.readlines()
for i in range(len(lines)):
    lines[i] = list(map(int, lines[i].split()))

def add(a, b):
    print(a + b)

for i in range(len(lines)):
    add(lines[i][0], lines[i][1])

2.3 案例2

输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)

n = int(input())
for _ in range(n):
    a,b = map(int,input().strip().split())
    print(a+b)
import sys

if __name__ == '__main__':
    count = int(sys.stdin.readline())
    for line in sys.stdin.readlines():
        print(sum(list(map(int, line.strip().split()))))
        

2.4 案例3

多个测试用例,每个测试用例一行。

每行通过空格隔开,有n个字符,n<100
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
a c bb
f dddd
nowcoder

a bb c
dddd f
nowcoder

import sys
for line in sys.stdin:
    l=line.strip().split(" ")
    l.sort()
    print(" ".join(l))

3 背包问题

3.1 问题描述

在这里插入图片描述

在这里插入图片描述

3.2 解法

在这里插入图片描述

在这里插入图片描述

(1)构建二维表,0的地方补0
(2)填表,分两种情况,一是装这个物体最大价值能是多少,一是不装这个物体最大价值能是多少
(3)把表都填好了

在这里插入图片描述

在这里插入图片描述

3.3 代码

下面的代码有错

# 背包问题

def bag(n,rongliang,weight,value):
    """
    填好表
    :param n:
    :param rongliang:
    :param weight:
    :param value:
    :return:
    """
    weight1 = weight.copy()
    value1 = value.copy()
    weight1.insert(0, 0)
    value1.insert(0, 0)
    value_mat = [[0 for j in range(rongliang + 1)] for i in range(n + 1)]

    for i in range(1,n+1):
        for j in range(1,rongliang+1):
            value_mat[i][j] = value_mat[i-1][j]
            if weight1[i]<=j and value_mat[i][j]<value_mat[i-1][j-weight1[i]] + value1[i]:
                value_mat[i][j] = value_mat[i-1][j-weight1[i]] + value1[i]

    return value_mat

def show(n,rongliang,weight,value_mat):
    wuping = []
    select_i = [False for i in range(n+1)]
    j = rongliang
    for i in range(n,0,-1):
        if value_mat[i][j]>value_mat[i-1][j]:
            print("出错",i,j,value_mat[i][j])
            print("dd",value_mat[i-1][j])
            select_i[i] = True
            print("减去的值是:",weight[i-1])
            j = j-weight[i-1]

    for i,v in enumerate(select_i):
        if v:
            wuping.append(i)

    return wuping

if __name__ == '__main__':
    # 背包容量
    rongliang = 10
    # 物品个数
    n = 4
    # 每个物品重量
    weight = [2, 3, 6, 7]
    # 每个物品价值
    value = [1, 4, 5, 6]
    value_mat = bag(n,rongliang,weight,value)
    print(value_mat)
    max_value = value_mat[n][rongliang]
    result = show(n,rongliang,weight,value_mat)
    print(max_value)
    print(result)

3.4 参考

[1] 【动态规划】背包问题_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1K4411X766?from=search&seid=7055198306793056692&spm_id_from=333.337.0.0

[2] 很容易理解的动态规划背包问题讲解_二维矩阵填表_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1Mf4y1y7WD?from=search&seid=7055198306793056692&spm_id_from=333.337.0.0

[3] (71条消息) 01背包问题(动态规划)python实现_littlethunder的专栏-CSDN博客
https://blog.csdn.net/littlethunder/article/details/26575417

3.5 完全背包问题

【动态规划】一次搞定三种背包问题_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1CV411E7Rm?from=search&seid=7055198306793056692&spm_id_from=333.337.0.0

4 最短路径

4.1(1)单源最短路_牛客题霸_牛客网

https://www.nowcoder.com/practice/9f15b34a2a944a7798a5340ff0dba8b7?tpId=188&&tqId=38651&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking

给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出从1号点到n号点的最多经过k条边的最短距离,如果无法从1号点走到n号点,输出impossible。
注意:图中可能 存在负权回路 。
输入格式

第一行包含三个整数n,m,k。

接下来m行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。

输出格式

输出一个整数,表示从1号点到n号点的最多经过k条边的最短距离。

如果不存在满足条件的路径,则输出“impossible”。

数据范围

1≤n,k≤500
1≤m≤10000
任意边长的绝对值不超过10000。

3 3 1
1 2 1
2 3 1
1 3 3
n, m, k = map(int, input().split())
edges = []
dist = [float('inf')]*(n+1)
for _ in range(m):
    edges.append(list(map(int, input().split())))
 
def bellmanFord(k):
    dist[1] = 0
    for _ in range(k):
        dist2 = dist.copy()
        for a, b, w in edges:
            dist[b] = min(dist[b], dist2[a]+w)
 
bellmanFord(k)
print('impossible') if dist[n] == float('inf') else print(dist[n])
        

(2)(4条未读私信) 最短路径求和_哔哩哔哩笔试题_牛客网
https://www.nowcoder.com/questionTerminal/e228a521eb274cf58ebb40621119d3df

(3)矩阵的最小路径和_牛客题霸_牛客网
https://www.nowcoder.com/practice/7d21b6be4c6b429bb92d219341c4f8bb?tpId=188&&tqId=38601&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking

4.2 数组最短路径

算法题3(最小路径和)_GZAY的博客-CSDN博客
https://blog.csdn.net/weixin_44139445/article/details/108523488

LeetCode算法题:最小路径和minPathSum_Mike的博客-CSDN博客
https://blog.csdn.net/weixin_43777983/article/details/101198672

思想

在这里插入图片描述

参考资料

把下面的参考1和2看了就行了,第1个是理论,第2个是跟着学
【1】【北京大学】数据结构与算法Python版(完整版)_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1VC4y1x7uv?from=search&seid=4245546755844556440&spm_id_from=333.337.0.0

【2】跟这个学就够了,代码随想录学算法,刷力扣(leetcode)不知道怎么刷?来看看,我把刷题网站上线了!最强刷题攻略!_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1AL4y1H7UH?spm_id_from=333.999.0.0

【1】【新】Leetcode算法刷题思路与教学–基于Python_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1Ct4y1a72Sfrom=search&seid=14623980813035598179&spm_id_from=333.337.0.0

【2】LeetCode力扣刷题 | 剑指Offer题解 | 画解算法思路Python3或C++代码实现_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1CK411c7gx?from=search&seid=14623980813035598179&spm_id_from=333.337.0.0

【3】【Python算法+数据结构】适合零基础学习的Python,帮你快速通过大厂_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1tq4y1376m?from=search&seid=16538620868821790748&spm_id_from=333.337.0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓码bigdata

如果文章给您带来帮助,感谢打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值