上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习..

这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就当重新学习吧~

第198题 House Robber

题目的意思:一个抢劫者要抢劫一条街上的住户,由于每家都有报警器,连续抢劫2家就会触发报警器。现在给你一个列表,里面的元素是每家可抢劫的金额,要求在不触发报警器的情况下抢劫最多的钱

分析:这是一道典型的动态规划题,我们先分析一下。

对于每一家,抢劫者的选择有两个:抢劫或者不抢劫。根据要求我们可以知道,不能连续抢劫2家。假设d(N)是抢劫犯抢劫到第N家的最大金额。当抢劫者抢劫第N家的时候,有两种情况:

  1. 抢劫第N家,这时候d(N)=nums[N]+d(N-1),而且我们可以知道,第N-1家不能抢劫
  2. 不抢劫第N家,这时候d(N)=d(N-1)

    所以我们可以得到:d(N) = max(nums[N] + d(N-1), d(N-1)). 下面是解法:
class Solution:
# @param {integer[]} nums
# @return {integer}
def rob(self, nums):
noRobN = 0 (不抢劫第N家)
robN = 0 (抢劫第N家)
maxProfix = 0 (最大金额)
for i in range(len(nums)):
robN = nums[N] + noRobN
noRobN = maxProfix
maxProfix = max(robN, noRobN) return maxProfix

第70题 Climbing Stairs

题目的意思:上楼要爬n级台阶,每次爬台阶有两种爬法:1. 爬一级台阶 2. 爬二级台阶。现在要求爬n级台阶一共有多少种爬法

分析:假设d(n)是爬第n级台阶的时候的爬法个数。当要爬n级台阶的时候,有两种情况:

  1. 从第n-1级台阶爬一级
  2. 从第n-2级台阶爬两级

    所以我们可以得到:d(n) = d(n-1) + d(n-2),下面是解法:
class Solution:
# @param {integer[]} nums
# @return {integer}
def climbStairs(self, n):
step = 0
onestep = 1
twostep = 0 for i in range(n):
step = onestep + twostep
twostep = onestep
onestep = step
return step

第120题 Triangle

题目的意思:给予一个由多个数列组成的三角形,找出从顶端到底层的最短路径,上层的数字只能移动到下层中与之相邻的数字上。例如:

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]

最短路径和 = 2+3+5+1 = 11

分析:这道题不能直接找每行数列的最小值然后相加就和. 这道题的思路是把下层的数依次与上层的数相加(取相邻上层的两个数中的较小的那个),然后取最小,直到最底层。

class Solution:
# @param triangle, a list of lists of integers
# @return an integer
def minimumTotal(self, tr):
#特殊情况,只有一行
if len(tr) == 1:
return tr[0][0]
for i in range(1, len(tr)): #从第二行开始
for j in range(len(tr[i])):
if j == 0: #第一个数
tr[i][j] = tr[i-1][j] + tr[i][j]
elif j == len(tr[i]) -1: #最后一个数
tr[i][j] = tr[i][j] + tr[i-1][j-1]
else: #一般情况
tr[i][j] = min(tr[i-1][j-1], tr[i-1][j]) + tr[i][j]
return min(tr[len(tr)-1])

延伸一下,如果需要输出路径,也很简单,最开始我们新建一个列表,比如li = [],然后每当取到每行的最小值的时候,就把这个数推入列表中,最后输出列表即可

第64题 Minimum Path Sum

题目的意思:给予一个m * n 的表格grid,表格里面填充了数字,求从grid[0][0]到grid[m-1][n-1]的最小和路径。每次移动只能向下或向右

分析:这道题和上一道基本一样,思路就是MPS[i][j] = Min(MPS[i-1][j],MPS[i][j-1])+ val[i][j]

class Solution:
# @param {integer[][]} grid
# @return {integer}
def minPathSum(self, grid):
row = len(grid) #行
col = len(grid[0]) #列 for i in range(row):
for j in range(col):
if i == 0 and j ==0:
pass
elif i == 0 and j != 0: #最上面一行
grid[i][j] = grid[i][j] + grid[i][j-1]
elif j == 0 and i != 0: #最左边一列
grid[i][j] = grid[i][j] + grid[i-1][j]
else:
grid[i][j] = grid[i][j] + min(grid[i][j-1], grid[i-1][j])
return grid[row-1][col-1]

leetcode算法刷题(二)——动态规划(一)的更多相关文章

  1. leetcode算法刷题(四)——动态规划(二)

    又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...

  2. leetcode算法刷题(五)——动态规划(三)

    今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...

  3. leetcode 算法刷题(一)

    今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...

  4. leetcode算法刷题(三)

    今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...

  5. Leetcode算法刷题:217和219题 Contains Duplicate

    从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...

  6. Leetcode算法刷题:第100题 Same Tree

    Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...

  7. Leetcode算法刷题:第14题 Longest Common Prefix

    Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...

  8. Leetcode算法刷题:第112题 Path Sum

    Path Sum 题目 给予一个二叉树,和一个值su,寻找是否有一个从根节点到叶节点的和为su,有则返回True,没有为False.比如: 5 / \ 4 8 / / \ 11 13 4 / \ \ ...

  9. leetcode top-100-liked-questions刷题总结

    一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...

随机推荐

  1. stringstream函数(i o)

    stringstream函数 头文件  #include<sstream> stringstream是字符串流,被用来切分数据或转化类型 样例一(摘) 输入n,代表接下来输入n行资料,每行 ...

  2. T - 阿牛的EOF牛肉串(第二季水)

    Description          今年的ACM暑期集训队一共有18人,分为6支队伍.其中有一个叫做EOF的队伍,由04级的阿牛.XC以及05级的COY组成.在共同的集训生活中,大家建立了深厚的 ...

  3. 关于json对象的遍历

    json格式的数据越来越多的在web开发中起到重要作用.下面介绍对于json对象和数组经常用到解析方法. var obj ={”name”:”冯娟”,”password”:”123456″,”depa ...

  4. Android 桌面生成快捷方式

    Android生成桌面快捷方式的几种方法: //------------以下为动态替换桌面应用Icon的一种解决方案------------------- // 1.获取本地目录图片的Bitmap ; ...

  5. 命名空间 - PHP手册笔记

    概述 命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念,比如在操作系统中,目录用来将相关文件分组,对于目录中的文件来说,目录就扮演了命名空间的角色.这个原理应用到程序设计领域就是命名空间 ...

  6. python Tkinter 全屏显示

    #! /usr/bin/env python # -*- coding: utf-8 -*- import Tkinter as tk class FullScreenApp(object): def ...

  7. 关于android socket出现at java.net.DatagramSocket java.net.BindException at libcore.io.IoBridge.bind(IoBridge.java:89)等waring

    经查,是socket地址重复使用的原因,将代码做如下改变即可. ctlClient = new DatagramSocket(TRANSCTLPORT); ctlClient = new Datagr ...

  8. Git学习02 --暂存区,撤销修改,删除文件

    工作区和暂存区概念: 工作区(Working Directory)就是你在电脑里能看到的目录. 版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. Gi ...

  9. 抛弃QP

        随着软件的慢慢进行发现QP根本无法建立多个实例,也就是无法在多个任务中同时使用QP的事件回调 架构,这点同libevent不同,最终决定放弃之,乖乖的用freeRTOS多任务方案,workin ...

  10. 对DTU系统结构的重新思考

        从决定做DTU开始无时无刻不在对这个新的产品系统进行思考,从最开始的ucos多任务结果到QPC基 于事件回调的软件结果,再到现在准备结合两者使用QPC+freeRTOS的系统结构.     原 ...