算法笔记: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; // 检查最低位是否为 1
           n >>>= 1;       // 无符号右移 1 位
       }
       return count;
   }
  1. 利用内置方法
public class CountOnes {
 public static void main(String[] args) {
     int number = 29; // 例如:29 的二进制是 11101
     int 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赛制我已经死了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 构建时候提示超时错误被终止

近期在使用 Jenkins 构建项目的时候&#xff0c;经常性得到错误&#xff1a; - Building for production... Build timed out (after 3 minutes). Marking the build as aborted.当再次重构后&#xff0c;貌似没有问题&#xff0c;等候一段时间后问题又再次出现。 问题和解决…

angular实现list列表和翻页效果

说明&#xff1a;angular实现list列表和翻页效果 上一页 当前页面 下一页 效果图&#xff1a; step1: E:\projectgood\ajnine\untitled4\src\app\car\car.component.css .example-form-fields {display: flex;align-items: flex-start; }mat-list-item{background: antiquew…

基于SpringBoot+Gpt个人健康管家管理系统【提供源码+答辩PPT+参考文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

Ubuntu开启FTP与SSH服务

在配置开发环境时&#xff0c;这两个配置感觉是最有用的&#xff0c;开启FTP服务可以将远程linux上的文件映射到Windows上&#xff0c;不管是使用虚拟机还是嵌入式linux设备&#xff0c;特别在开发写代码的时候&#xff0c;映射到Windows上使用VS code打开编写比在linux上编写舒…

GitHub上传自己的项目

目录 一、安装Git插件 1&#xff09;下载 2&#xff09;安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user]&#xff0c;下次可以直接用 一、安装Git插件 1&#xff09;下载 下载地址&#x…

10款音视频转文字工具体验记!!!

如今互联网数据的便捷&#xff0c;记录不仅仅只有文字的形式&#xff0c;还有视频的形式&#xff01;但是有时候&#xff0c;我们只有视频&#xff0c;却需要文字文档&#xff0c;那要怎么办呢&#xff1f;今天我要和大家分享一下我使用过的那些语音转文字工具的体验感受。语音…

SpringBoot在线教育系统:集成第三方服务

5系统详细实现 5.1 普通管理员管理 管理员可以对普通管理员账号信息进行添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 普通管理员管理界面 5.2 课程管理员管理 管理员可以对课程管理员进行添加修改删除操作。具体界面如图5.2所示。 图5.2 课程管理员管理界面 5.3 …

深度学习基础知识-损失函数

目录 1. 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2. 平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09; 3. Huber 损失 4. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09; 5. KL 散度&#xff08;Kullback-Leibler Divergence&…

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

基于springboot+vue实现的养老院管理系统(源码+L文+ppt)

基于springbootvue实现的养老院管理系统&#xff08;源码L文ppt&#xff09;4-106 养老院系统管理是一个综合性养老在线平台&#xff0c;旨在综合并简化养老机构中的照护流程。该系统集成了多种功能&#xff0c;以支持医生、护士、家属及管理员等不同角色的需求。对于医务人员而…

dify实战案例分享-基于多模态模型的发票识别

1 什么是dify Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#xff0c;旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务&#xff08;Backend as Service, BaaS&#xff09;和LLMOps的理念&#xff0c;使开发者能够快速搭建生产级的AI应用…

QML项目实战:自定义Switch按钮

目录 一.添加头文件 1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Switch 三.标签 四.效果 五.代码 一.添加头文件 1.QtQuick.Controls 2.1 QtQuick.Controls 提供了一组预定义的 UI 控件&#xff0c;这些控件可以用于构建现代、响应式的用户界面。它包…

开源框架Openlayers:就业必学,打造3D互动式地图

OpenLayers是一个开源的WebGIS库&#xff0c;支持多种地图类型&#xff0c;提供丰富的功能和API&#xff0c;支持多种格式&#xff0c;可以进行空间分析和可视化&#xff0c;还可以制作融合图层和定制地图。 在招聘市场中&#xff0c;OpenLayers的地位也是不可小觑的&#xff0…

React系列教程(2)React哲学

豆约翰习惯将掌握某一技术分为5个层次&#xff1a;初窥门径&#xff0c;小试牛刀&#xff0c;渐入佳境&#xff0c;得心应手&#xff0c;玩转自如 本篇属于React框架中的第1层次即初窥门径 我们认为&#xff0c;React 是用 JavaScript 构建快速响应的大型 Web 应用程序的首选方…

无人机声学侦测算法详解!

一、算法原理 无人机在飞行过程中&#xff0c;其电机工作、旋翼震动以及气流扰动等都会产生一定程度的噪声。这些噪声具有独特的声学特征&#xff0c;如频率范围、时域和频域特性等&#xff0c;可以用于无人机的检测与识别。声学侦测算法利用这些特征&#xff0c;通过一系列步…

【C++】继承的理解

1.继承的概念和定义 1.1继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段&#xff0c;它允许程序员在 保 持原有类特性的基础上进行扩展 &#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承 呈现了面向对象 程序…

车圈大厂9月利润率惨淡收尾,“金九”或变“铜九”

撰文&#xff5c;ANGELICA 编辑&#xff5c;ANGELICA 审核&#xff5c;烨 Lydia 声明&#xff5c;图片来源网络。日晞研究所原创文章&#xff0c;如需转载请留言申请开白。 国庆假期第一天&#xff0c;不少车企就迫不及待晒出假期战报。 按照以往的经验&#xff0c;每年9月…

蓝牙是如何诞生,如何工作,如何发展的?【无线通信小百科】

蓝牙为什么叫蓝牙&#xff1f;深入了解关于蓝牙的一切|无线通信小百科 在前两期文章&#xff0c;我们为大家介绍了无限通信技术是如何工作&#xff0c;如何发展&#xff1b;也为大家讲解了目前主流无线通信模块、SoC方案都有哪些。 无线通信工作原理、发展历程介绍https://blo…

Pytorch cuda版本选择(简洁高效版)

简而言之 Pytorch cuda版本选择 只需要低于cuda驱动版本即可&#xff0c;cuda版本查看是nvidia-smi, nvcc -V 是runtimeapi版本可以不用管 1.只要看cuda驱动版本 安装pytorch 选择cuda版本&#xff0c;只要看你电脑cuda驱动版本即可。 2.选择依据 pytorch中cuda版本只要不高于…

告别复杂协作:Adobe XD的简化替代方案

Adobe XD是一款集成UI/UX设计和原型创建功能的设计平台。它允许用户进行网页、移动应用的设计&#xff0c;以及原型的绘制&#xff0c;并且能够将静态设计转化为动态的交互原型。尽管Adobe XD提供了这些功能&#xff0c;但它依赖于第三方插件&#xff0c;且插件库有限&#xff…