算法笔记:Day-09(初始动态规划)

509. 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30
class Solution {public int fib(int n) {if(n<=1){return n;}int a=0,b=1,ans=0;for(int i=2;i<=n;i++){ans=a+b;a=b;b=ans;}return ans;}
}

70. 爬楼梯

  • 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

    每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    示例 1:

    输入:n = 2
    输出:2
    解释:有两种方法可以爬到楼顶。
    1. 1 阶 + 1 阶
    2. 2 阶
    

    示例 2:

    输入:n = 3
    输出:3
    解释:有三种方法可以爬到楼顶。
    1. 1 阶 + 1 阶 + 1 阶
    2. 1 阶 + 2 阶
    3. 2 阶 + 1 阶
    

    提示:

    • 1 <= n <= 45
class Solution {public int climbStairs(int n) {int a=1,b=2;if(n==1)return a;if(n==2)return b;int ans=0;for(int i=3;i<=n;i++){ans=a+b;a=b;b=ans;}return ans;}
}

就是在一些最优子结构的基础上跳跃。
n==3时 有三种爬法 因为一次可以爬一阶或者两阶,所以在dp[1]的基础上跳两阶加上dp[2]跳一阶,就是两个最优子结构相加。

  1. 1 阶 + 2 阶
  2. 1 阶 + 1 阶 + 1 阶
  3. 2 阶 + 1 阶

55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 105
class Solution {public boolean canJump(int[] nums) {int maxStep=0,len=nums.length;for(int i=0;i<len;i++){if(i>maxStep){return false;}maxStep=Math.max(maxStep,i+nums[i]);if(maxStep>=len-1){return true;}}return false;}
}

遍历数组更新最远距离,如果i超过了最远距离,说明跳不到 i 索引,即跳不到终点。

45. 跳跃游戏 II

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2
class Solution {public int jump(int[] nums) {int len=nums.length;int maxStep=0;int end=0;int ans=0;for(int i=0;i<len-1;i++){maxStep=Math.max(maxStep,i+nums[i]);if(i==end){ans++;end=maxStep;}}return ans;}
}

在这里插入图片描述

338. 比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例 1:

输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10

示例 2:

输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
class Solution {public int[] countBits(int n) {int[] ans=new int[n+1];int temp=0;for(int i=0;i<=n;i++){ans[i]=countOnes(i);}return ans;}public int countOnes(int x){int count=0;while(x!=0){x &= (x-1);count++;}return count;}
}

三种计算二进制中1的个数

  1. 利用位运算
public static int countOnes(int n) {int count = 0;while (n != 0) {count += n & 1; // 检查最低位是否为 1n >>>= 1;       // 无符号右移 1 位}return count;}
  1. 利用内置方法
public class CountOnes {public static void main(String[] args) {int number = 29; // 例如:29 的二进制是 11101int count = Integer.bitCount(number);System.out.println("1 的个数: " + count);}
}
  1. 利用Brian Kernighan 算法
public static int countOnes(int n) {int count = 0;while (n != 0) {n &= (n - 1); // 将最低位的 1 清零count++;}return count;}

大佬的解法也不错在这里插入图片描述

198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。
解法一:
class Solution {public int rob(int[] nums) {int len=nums.length;int[] dp=new int[len];if(len==0)return 0;if(len==1)return nums[0];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<len;i++){dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}return dp[len-1];}
}
解法二:
class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0) {return 0;}int length = nums.length;int first=0,second=0;for (int i = 0; i < length; i++) {int temp = second;second = Math.max(first + nums[i], second);first = temp;}return second;}
}

解法二:因为每个最优子结构只与连两个房子有关。不需要考虑溢出问题,而且可以从0开始遍历,且空间复杂度为O(1)。
这个解法对于打家劫舍2有很大的优势。

213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3
class Solution {public int rob(int[] nums) {if(nums.length == 0) return 0;if(nums.length == 1) return nums[0];return Math.max(myRob(Arrays.copyOfRange(nums, 0, nums.length - 1)), myRob(Arrays.copyOfRange(nums, 1, nums.length)));}private int myRob(int[] nums) {int pre = 0, cur = 0, tmp;for(int num : nums) {tmp = cur;cur = Math.max(pre + num, cur);pre = tmp;}return cur;}
}

这个解法简单优雅,不用考虑溢出问题。

class Solution {public int rob(int[] nums) {int len=nums.length;if(len==0)return 0;if(len==1)return nums[0];return Math.max(myRob(Arrays.copyOfRange(nums,0,len-1)),myRob(Arrays.copyOfRange(nums,1,len)));}public int myRob(int[] nums){int len=nums.length;int[] dp=new int[len];if(len==0)return 0;if(len==1)return nums[0];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<len;i++){dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);}return dp[len-1];}
}

两个方法考虑溢出,因为如果len==2的话myRob会出现溢出问题,烦死人了,如果时OI赛制我已经死了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2707.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP和HTTPS 的作用和应用场景 (python 爬虫简单入门)

HTTP和HTTPS HTTP HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff1a;是一种发布和接收 HTML页面的方法。 HTTP的端口号为80 HTTPS HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;…

Java多线程编程(三)一>详解synchronized, 死锁,wait和notify

目录&#xff1a; 一.synchronized 的使用&#xff1a; 二. 常见死锁情况&#xff1a; 三 .如何避免死锁&#xff1a; 四.wait和notify 一.synchronized 的使用&#xff1a; 我们知道synchronized锁具有互斥的特点&#xff1a; synchronized 会起到互斥效果, 某个线程…

linux入门——“初识make”

make是linux中的自动化构建工具&#xff0c;一般来说系统会自带make&#xff0c;如果没有&#xff0c;那么可以使用命令“sudo apt install -y make”来安装。 1.初识make make使用的前提是维护makefile/Makefile文件&#xff0c;需要在自己的目录下自己创建。 我在此目录下创…

【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】

在 Kubernetes 中&#xff0c;Service 提供了一种稳定的方式&#xff0c;通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务&#xff0c;并且出现 DNS 解析失败时&#xff0c;通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。 一、问…

关于分布式事务,你知道多少?如何落地?

很多人估计会说&#xff0c;我在项目中完全没有涉及到过分布式事务&#xff0c;而面试官老喜欢问&#xff0c;真TM烦&#xff01; 本文就来聊聊分布式事务&#xff0c;有哪些方案和实现。文章有点长&#xff0c;可以先收藏&#xff0c;有时间了慢慢看。 什么是事务&#xff1f;…

SIwave:释放 Resonant Mode Solver 的强大功能

SIwave 是一种电源完整性和信号完整性工具。本文的重点是 Resonant 模式求解器。 进行谐振计算的主要原因是确定 Powerplane 中 Cap 去耦的最佳位置。Powerplane 的大小由最大预期电流和允许的最大电压降决定。然而&#xff0c;即使是最好的设计也没有足够的电容来将宽带频谱的…

【VS+QT】联合开发踩坑记录

0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作&#xff0c;需要用到QT&#xff0c;所以选择了VS联合开发&#xff0c;方便调试。学习QT的过程中也踩了很多坑&#xff0c;在此记录一下&#xff0c;提供给各位参考。 1. 环境配置 Win11Visual Studio 2019Qt 5.12…

【LeetCode】每日一题 2024_11_1 超级饮料的最大强化能量(DP)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;超级饮料的最大强化能量 代码与解题思路 先读题&#xff1a; 题目给了两个数组&#xff0c;长度为 n&#xff0c;题目要求在 n 个小时内选择饮料&#xff0c;一个小时可以选一瓶&#x…

IBM服务器修改IMM的IP方法

服务器设备&#xff1a;IBM x3550 M4 Server IMM默认IP地址&#xff1a;192.168.70.125 用户名&#xff1a;USERID 密码&#xff1a;PASSW0RD&#xff08;注意是零0&#xff09; 1.服务器开机按F1进入BIOS界面 2.进入System Settings 3.进入Integrated Management Module 4.…

【MATLAB代码】一维UKF的IMM,模型有CV和CA

目录 ​编辑 代码介绍 主要功能 UKF 更新函数 总结 代码介绍 这段 MATLAB 代码实现了一维无迹卡尔曼滤波&#xff08;UKF&#xff09;与交互多模型&#xff08;IMM&#xff09;结合的算法&#xff0c;旨在对非线性动态系统进行状态估计。代码中的模型包括恒速&#xff08…

Java对象、类、接口——针对实习面试

目录 Java对象、类、接口你知道类和对象的区别吗&#xff1f;抽象类和接口有什么共同点&#xff1f;抽象类和接口有什么区别&#xff1f;说一下面向对象的三大特征及其特点&#xff1f;你知道Java中方法重载和重写的区别吗&#xff1f;静态成员和非静态成员有什么区别&#xff…

Solana链上的Pump狙击机器人与跟单机器人的工作原理及盈利模式

随着加密货币市场的快速发展&#xff0c;越来越多的投资者和开发者开始关注Solana链上的自动化交易工具。尤其是Pump狙击机器人和跟单机器人&#xff0c;这两种工具为用户提供了在市场波动中获取利润的机会。本文将深入分析这两种机器人的工作原理及其盈利模式。 一、Pump狙击机…

Vue全栈开发旅游网项目(6)-接口开发

1.景点详情接口开发 1.设计响应数据结构 文件地址&#xff1a;sight/serializers.py 创建类&#xff1a; class SightDetailSerializers(BaseSerializer):#景点详情def to_dict(self):obj self.objreturn {id: obj.id,name: obj.name,desc: obj.desc,img: obj.banner_img.…

Flutter学习笔记(二)------ 第一个flutter项目

一、Dart语法 dart语法较为简单&#xff0c;学过python和c后发现大同小异。不过多介绍 1.函数可变参数 可以类比*args, **kwargs&#xff0c;与之不同的是dart中&#xff0c;*args **kwargs不能同时存在 void a(int a, [float x, double b0.0]) {//do something... }a(10, …

MySQL-如果你在添加外键时忘加约束名,如何找到系统默认的约束名

问题 在你添加约束的时候&#xff0c;一般都会为其取名以方便后期的修改&#xff0c;但是如果你忘记了呢&#xff0c;如何找到系统默认的约束名 解决方法 -- 查找约束名 SELECTCONSTRAINT_NAME FROMINFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERETABLE_NAME emp ANDREFERENCED_T…

2-Ubuntu/Windows系统启动盘制作

学习目标&#xff1a; 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器&#xff0c;确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器&#xff0c;理解启动盘的使用场景和注意事项&#xff0c;…

上云管理之Git/GitHub/GitLab 详解(一)

上云管理之Git/GitHub/GitLab 详解(一&#xff09; 引言1. GIT软件安装2.初始化配置与提交代码2.1. 初始化配置2.2 本地仓库代码提交2.2.1 初始化仓库并提交代码2.2.2 再次提交已修改的代码2.2.3 文件夹层次结构代码提交 2.3 GIT 的文件状态 3.GIT 分支3.1. 分支的切换与删除3.…

【UltraVNC】使用反向连接方式-部署私有远程工具(简版)

一、简要介绍 反向连接&#xff1a;客户电脑发起连接到维修工程师电脑。 场景&#xff1a;计算机A 无公网IP &#xff0c;计算机B无公网IP&#xff0c;AB直接进行远程的行为。 核心&#xff1a;借助中继方式 二、安装环境和安装包 中继器服务&#xff1a;linux系统安装包&…

技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代

在当今数字化时代&#xff0c;软件安全问题的严峻性日益凸显。随着网络攻击手段变得愈发复杂多样&#xff0c;切实保障软件系统的安全性已然成为开发者以及企业所面临的核心挑战。依据国际网络安全机构的相关报告&#xff0c;网络攻击事件的发生频率与复杂程度呈现出逐年递增的…

【图书管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+网站系统

一、介绍 图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构&#xff0c;后端采用Django作为逻辑处理&#xff0c;通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有&#…