Android学习总结之算法篇三(打家劫舍)

news2025/4/4 11:20:00

打家劫舍一

// 动态规划
class Solution {
	public int rob(int[] nums) {
		if (nums == null || nums.length == 0) return 0;
		if (nums.length == 1) return nums[0];

		int[] dp = new int[nums.length];
		dp[0] = nums[0];
		dp[1] = Math.max(dp[0], nums[1]);
		for (int i = 2; i < nums.length; i++) {
			dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
		}

		return dp[nums.length - 1];
	}
}

 打家劫舍二(环)

public class HouseRobberCircular {
    /**
     * 计算在环形房屋布局下,不触动警报装置时能偷窃到的最大金额
     * 由于房屋围成一圈,所以需要分别考虑不偷第一间房屋和不偷最后一间房屋的情况
     * @param nums 每个房屋存放的金额数组
     * @return 最大偷窃金额
     */
    public int rob(int[] nums) {
        // 如果数组长度为 1,直接返回该房屋的金额
        if (nums.length == 1) {
            return nums[0];
        }
        // 计算不偷第一间房屋时能获得的最大金额
        int max1 = robRange(nums, 1, nums.length - 1);
        // 计算不偷最后一间房屋时能获得的最大金额
        int max2 = robRange(nums, 0, nums.length - 2);
        // 返回两种情况中的最大值
        return Math.max(max1, max2);
    }

    /**
     * 计算在指定范围内的房屋中,不触动警报装置时能偷窃到的最大金额
     * @param nums 每个房屋存放的金额数组
     * @param start 起始房屋索引
     * @param end 结束房屋索引
     * @return 指定范围内的最大偷窃金额
     */
    private int robRange(int[] nums, int start, int end) {
        // 记录前一个房屋的最大偷窃金额
        int prevMax = 0;
        // 记录当前房屋的最大偷窃金额
        int currMax = 0;
        // 遍历指定范围内的房屋
        for (int i = start; i <= end; i++) {
            // 临时保存当前房屋的最大偷窃金额
            int temp = currMax;
            // 更新当前房屋的最大偷窃金额,取偷当前房屋和不偷当前房屋的最大值
            currMax = Math.max(prevMax + nums[i], currMax);
            // 更新前一个房屋的最大偷窃金额
            prevMax = temp;
        }
        // 返回指定范围内的最大偷窃金额
        return currMax;
    }

    public static void main(String[] args) {
        // 创建 HouseRobberCircular 类的实例
        HouseRobberCircular solution = new HouseRobberCircular();
        // 定义测试数组
        int[] nums = {2, 3, 2};
        // 调用 rob 方法计算最大偷窃金额并打印输出
        System.out.println(solution.rob(nums)); 
    }
}    

打家劫舍三(二叉树)

// 定义二叉树节点类
class TreeNode {
    // 节点存储的金额
    int val;
    // 左子节点
    TreeNode left;
    // 右子节点
    TreeNode right;
    // 构造函数,用于初始化节点的值
    TreeNode(int x) { 
        val = x; 
    }
}

public class HouseRobberBinaryTree {

    /**
     * 计算在不触发警报的情况下,小偷能从二叉树结构的房屋布局中盗取的最大金额
     * @param root 二叉树的根节点
     * @return 可盗取的最大金额
     */
    public int rob(TreeNode root) {
        // 调用 dfs 方法获取两个值,分别是不偷根节点和偷根节点时的最大金额
        int[] result = dfs(root);
        // 返回两者中的最大值作为最终结果
        return Math.max(result[0], result[1]);
    }

    /**
     * 深度优先搜索方法,递归计算以当前节点为根的子树中,不偷和偷当前节点时的最大金额
     * @param node 当前处理的节点
     * @return 包含两个元素的数组,第一个元素是不偷当前节点的最大金额,第二个元素是偷当前节点的最大金额
     */
    private int[] dfs(TreeNode node) {
        // 如果当前节点为空,意味着没有房屋可偷,返回 [0, 0]
        if (node == null) {
            return new int[]{0, 0};
        }

        // 递归计算左子树的结果,得到不偷和偷左子树根节点的最大金额
        int[] left = dfs(node.left);
        // 递归计算右子树的结果,得到不偷和偷右子树根节点的最大金额
        int[] right = dfs(node.right);

        // 不偷当前节点的最大金额:左子树偷或不偷的最大金额 + 右子树偷或不偷的最大金额
        int notRobCurrent = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);

        // 偷当前节点的最大金额:当前节点金额 + 左子树不偷的最大金额 + 右子树不偷的最大金额
        int robCurrent = node.val + left[0] + right[0];

        // 返回包含不偷和偷当前节点最大金额的数组
        return new int[]{notRobCurrent, robCurrent};
    }

    public static void main(String[] args) {
        // 示例构建二叉树
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.right = new TreeNode(3);
        root.right.right = new TreeNode(1);

        // 创建 HouseRobberBinaryTree 类的实例
        HouseRobberBinaryTree solution = new HouseRobberBinaryTree();
        // 调用 rob 方法计算可盗取的最大金额
        int maxAmount = solution.rob(root);
        // 输出可盗取的最大金额
        System.out.println("可盗取的最大金额为: " + maxAmount);
    }
}    

打家劫舍四(最少金额) 

public class MinimumRobberyCapability {
    /**
     * 检查在给定的窃取能力下,是否能够窃取至少 k 间房屋
     * @param nums 每间房屋存放的现金金额数组
     * @param k 窃贼将会窃取的最少房屋数
     * @param capability 小偷的窃取能力
     * @return 如果能窃取至少 k 间房屋返回 true,否则返回 false
     */
    private boolean canRob(int[] nums, int k, int capability) {
        // 记录已窃取的房屋数量
        int count = 0;
        // 标记上一间房屋是否被窃取
        boolean lastRobbed = false;
        // 遍历每间房屋
        for (int num : nums) {
            // 如果上一间房屋未被窃取且当前房屋的现金金额不超过窃取能力
            if (!lastRobbed && num <= capability) {
                // 窃取当前房屋,窃取房屋数量加 1
                count++;
                // 标记当前房屋已被窃取
                lastRobbed = true;
            } else {
                // 当前房屋不被窃取,标记上一间房屋未被窃取
                lastRobbed = false;
            }
        }
        // 判断窃取的房屋数量是否至少为 k
        return count >= k;
    }

    /**
     * 计算小偷的最小窃取能力
     * @param nums 每间房屋存放的现金金额数组
     * @param k 窃贼将会窃取的最少房屋数
     * @return 小偷的最小窃取能力
     */
    public int minCapability(int[] nums, int k) {
        // 二分查找的左边界,最小窃取能力从 1 开始
        int left = 1;
        // 二分查找的右边界,设置一个较大的初始值
        int right = (int) 1e9;
        // 初始化结果为右边界的值
        int result = right;
        // 二分查找过程
        while (left <= right) {
            // 计算中间值
            int mid = left + (right - left) / 2;
            // 检查在中间值表示的窃取能力下,是否能窃取至少 k 间房屋
            if (canRob(nums, k, mid)) {
                // 如果可以,更新结果为中间值,并缩小右边界
                result = mid;
                right = mid - 1;
            } else {
                // 如果不可以,增大左边界
                left = mid + 1;
            }
        }
        // 返回最小窃取能力
        return result;
    }

    public static void main(String[] args) {
        // 创建 MinimumRobberyCapability 类的实例
        MinimumRobberyCapability solution = new MinimumRobberyCapability();
        // 示例房屋现金金额数组
        int[] nums = {2, 3, 5, 9};
        // 窃贼需要窃取的最少房屋数
        int k = 2;
        // 调用 minCapability 方法计算最小窃取能力
        int minCap = solution.minCapability(nums, k);
        // 输出结果
        System.out.println("小偷的最小窃取能力为: " + minCap);
    }
}    

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

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

相关文章

2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议

——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代&#xff1a;新能源赛道「超级独角兽」 作为全球动力电池龙头&#xff0c;宁德时代&#xff08;CATL&#xff09;的江湖地位无需多言&#xff1a; 技术硬实力&#xff1a;麒麟电池、钠离子电池、无钴电池等黑科技加持&…

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1&#xff0c;遇到的问题&#xff1a;将后端接口写完后我想通过PostMan进行简单的测试一下&#xff0c;一不小心就遇到了这样的情况&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Firefox 浏览器同步一个账户和书签网址

Firefox 浏览器同步一个账户和书签网址 Firefox 支持跨设备接续浏览&#xff0c;可实现电脑、手机与平板无缝衔接。无论您在使用哪台设备上使用 Firefox&#xff0c;都能获取书签、浏览历史、保存的密码等信息。当然也能实现windows、ios、linux、android系统中安装firefox浏览…

Maven多模块项目,其他项目引用子模块的依赖,无法打包,提示没有找到依赖

背景&#xff1a; 微服务项目 每个服务都是单独的项目&#xff0c;会存在依赖关联的问题&#xff0c;在子模块的下面 depoly 之后&#xff0c;就会出现别的项目&#xff0c;无法package 原因&#xff1a; 多模块项目&#xff0c;depoly 需要在父模块下面执行

mediacodec服务启动时加载media_codecs.xml

media.codec服务启动时&#xff0c; 会创建 implementation::Omx 和 implementation::OmxStore&#xff0c; 构造 Omx时&#xff0c; 会解析codec相关的xml文件&#xff0c;一般从会如下目录中&#xff0c; // from getDefaultSearchDirs() { "/product/etc",&quo…

本地部署DeepSeek-R1(Dify压力测试和性能调优)

安装压测软件 为了有效测试&#xff0c;应在局域网设备测试&#xff0c;我这里用的服务器是局域网内的Ubuntu&#xff0c;下载的压测软件是WRK apt install wrk测试脚本 为了省事我直接在/root目录下新建lua脚本 vim test.lua脚本内容如下&#xff0c;app-xxxx更换为你工作…

自动备份文件到服务器,自动备份文件到服务器有哪些方法?

将SQL Server数据库自动备份文件到服务器&#xff0c;可以通过多种方法实现。以下是几种常用的方法&#xff1a; 一、使用SQL Server Management Studio&#xff08;SSMS&#xff09;和SQL Server代理 配置SQL Server代理&#xff1a;确保SQL Server代理服务已启动。如果未启…

Ollama+open-webui搭建私有本地大模型详细教程

Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 简介 ​ Ollama 是一个轻量级的 AI 模型运行时&#xff0c;专注于简化 AI 模型的部署和使用。它支持多种预训练模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像&#xff0c;尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达&#xff0c;一下子击中了无数人的“童年回忆 审美舒适区”。 &#x1f3a8; 下面是一些 GPT-4o 实际生…

测试cursor-AI编辑器

Cursor是一个免费的&#xff0c;内置AI插件的编辑器&#xff0c;在vscode基础上开发&#xff0c;可以创建和分析代码&#xff0c;还能提出修改建议。官网是 https://www.cursor.com/cn 载入SFTP的方式跟vscode是一样的&#xff0c;但是会有这样的报错&#xff1a; 报错&#x…

[首发]烽火HG680-KD-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KD-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包 U盘强刷刷机步骤&#xff1a; 1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&a…

Spring Boot 快速入手

前言&#xff1a;为什么选择 Spring Boot&#xff1f; &#x1f680; 在现代 Java 开发中&#xff0c;Spring Boot 已成为最流行的后端框架之一。无论是小型 Web 应用、企业级系统&#xff0c;还是微服务架构&#xff0c;Spring Boot 都能提供快速开发、自动配置、轻量级部署的…

OpenAI最近放出大新闻,准备在接下来的几个月内推出一款“开放”的语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理

基于PyQt5的自动化任务管理软件&#xff1a;高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…

自动驾驶---学术论文的常客:nuScenes数据集的使用

1 前言 nuScenes 数据集在大模型训练中应用广泛&#xff0c;在很多CVPR或者其它论文中经常能看到使用nuScenes 数据集达到SOTA水平。 在之前的博客《自动驾驶---学术论文的常客&#xff1a;nuScenes 数据集》中&#xff0c;笔者主要介绍了nuScenes数据集的来源和下载方式&#…

使用大语言模型进行Python图表可视化

Python使用matplotlib进行可视化一直有2个问题&#xff0c;一是代码繁琐&#xff0c;二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发&#xff0c;以更少的代码进行画图的和美化的库&#xff0c;但是这也带来了定制化不足的问题。在大模型时代&#xff0c;这个…

C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题

C#调用ACCESS数据库&#xff0c;解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法&#xff1a; 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…

el-select+el-tree实现下拉树形选择

主要实现el-select下使用树结构,支持筛选功能 封装的组件 composeTree.vue <template><el-select :popper-class"popperClass"v-model"selectedList"placeholder"请选择"filterable:filter-method"handleFilter" multiple:c…

利用 Excel 函数随机抽取(附示例)

RANDARRAY 是 Excel 365 和 Excel 2021 引入的一个函数&#xff0c;用于生成一个随机数数组。它的语法如下&#xff1a; RANDARRAY([rows], [columns], [min], [max], [whole_number])参数详解 rows&#xff08;可选&#xff09; 要生成的行数&#xff08;默认值为 1&#xff…

DM数据迁移工具

DM数据迁移工具 一、概述二、迁移准备三、启动迁移工具1.Windows 环境启动 DM 数据迁移工具2.Linux 环境启动 DM 数据迁移工具2.1启用图形化安装界面前需要通过如下命令将图形界面权限放开&#xff1a;2.2进入数据库安装路径 /tool 目录下&#xff0c;运行 ./dts 即可启动 DM 数…