【每日刷题】打家劫舍

题目地址

https://leetcode-cn.com/problems/house-robber/

题目描述:打家劫舍

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

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

示例:

例 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 。

解答

阅读题目之后,可以发现题中存在重叠子问题,此时就要想到动态规划。

从最基本的开始考虑:

当数组中一个元素也没有时,自然会返回 0.

当数组中存在一个元素时,返回该元素即可。

当数组中存在两个元素时,返回二者的较大值即可。

当数组中存在三个元素时,例如 a[0], a[1], a[2], 返回值应该是 max( a[0] + a[2], a[1]).

据此,写出以下代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        if( nums.size() == 0)
            return 0;
        if( nums.size() == 1)
            return nums.front();

        vector<int> dp( nums.size(), 0);
        dp[0] = nums[0], dp[1] = nums[1];
        for( int i = 2; i < dp.size(); i++)
            dp[i] = nums[i] + max( dp[i-1] - nums[i-1], dp[i-2]);
        
        return max(dp[dp.size() -1], dp[dp.size()-2]);
    }
};

上述代码存在优化的空间。

基于SpringBoot+Vue的社区便民服务平台研究AI更换标第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问进行优化。5.1测试环境与工具介绍测试
### 算法热门与经典目推荐 对于希望深入练习并掌握算法的人来说,选择合适的目至关重要。基于此需求,这里整理了一份涵盖多个方面且被广泛认可的经典和热门目列表。 #### 数据结构基础巩固 为了打牢根基,在初期应当专注于熟悉基本的数据结构操作及其特性。建议从以下几个方向入手: - **链表** - 反转链表[^1] - 合并两个有序链表 - **栈与队列** - 使用栈实现括号匹配验证 - 设计循环队列 - **二叉树** - 前序遍历、中序遍历、后序遍历的迭代版本 - 验证二叉搜索树的有效性 ```python def is_valid_bst(root): stack, inorder = [], float('-inf') while stack or root: while root: stack.append(root) root = root.left root = stack.pop() # 如果当前节点小于等于上一个访问过的节点,则不是有效的BST if root.val <= inorder: return False inorder = root.val root = root.right return True ``` #### LeetCode前百精选 LeetCode上的前一百道目因其高频率出现在面试场景中而备受关注。以下是部分具有代表性的例子: - 数组相关: - 移动零 - 寻找数组中的消失数字 - 字符串处理: - 实现strStr()函数 - 整数反转 - 动态规划入门: - 不同路径[^4] - 打家劫舍 #### 提升阶段专项训练 当具备了一定的基础之后,可以通过特定主来进行更深层次的学习。例如: - 贪心策略的应用实例包括活动安排问等区间覆盖类问[^5]。 - 对于动态规划而言,《剑指Offer》一书提供了丰富的案例研究材料。 #### 进阶挑战 最终目标是在复杂度更高的环境中测试自己所学的知识和技术水平。此时可以选择随机抽取各类平台上的难进行实战演练,比如力扣(LeetCode)、牛客网(nowcoder)以及其他国际知名在线评测系统如HackerRank等提供的竞赛级试集[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值