LeetCode (20) house robber (数组不相邻元素最大值)

题目描述

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

这道题目的要求可以归纳为数组不相邻元素的最大和。这道题目可以根据动态规划的思想去解答。

对数组num从1…n的最大和f(n)可能有以下两种情况(注意这里为了说明方便,假设数组的起始元素为1):

  • f(n) = f(n-2) + num[n];
  • f(n) = f(n-1);

f(n)取以上两个值的最大值。当然本题可以使用递归的思路去处理,但是这样会进行多次重复的运算(本题其实类似于斐波那契数列),因此,从前向后的处理更有效率,这里只需要保存f(n-1)和f(n-2)的值即可。

代码如下:

class Solution {
public:
    int rob(vector<int> &num) {
        int size = num.size();
        if(size == 0)
            return 0;
        if(size == 1)
            return num[0];
        if(size == 2)
            return max(num[0], num[1]);

        int n1 = num[0];
        int n2 = num[0] > num[1] ? num[0] : num[1];

        for(int i = 2; i != num.size(); ++i)
        {
            int n = n1 + num[i];
            int n3 = n > n2 ? n : n2;
            n1 = n2;
            n2 = n3;
        }
        int r = max(n1, n2);
        return r;
    }
};
时间: 2024-10-09 10:49:46

LeetCode (20) house robber (数组不相邻元素最大值)的相关文章

求解一个数组中连续元素最大值

第一种实现是以O(N3) 即以n的三次方实现的,这个算法很简单,想法特别明显 第二种以O(N2) 即以n的二次方实现,算法简单,但是仍然不够好 第三种 O(N*log(N)) ,以n乘以log(N),采取分治法解决问题,当然也采取了递归的思想. 第四种O(N),这个方法就无敌了,线性时间,如果数组是在磁盘或者磁带上面,只需要读取数组,不需要存储在内存上面(联机算法),此算法简洁高效,最理想的算法 5 int f1(int p[],int left,int right){ 6 int tmp; 7

[leetcode] 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

34. 在排序数组中查找元素的第一个和最后一个位置 题目要求用O(logn),明显要用二分. 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = nums.length; int mid = (i + j) / 2; int p = -1; while (i < j) { if (nums[mid] == target) { p = mid; bre

LeetCode—House Robber 寻找数组不相邻组合最大值DP

https://leetcode.com/problems/house-robber/ 题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值 举一个例子 假设数据: 8 3 6 15 4 9 7 10 那么首先可能选取 8 , 3 每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合  8,3,14 到数字15,那么就可以考虑在8,3中进行组合  8,3,14,23,4,9,7,10 接下来的步骤: 8,3,14,23,1

leetcode——198 House Robber(寻找数组不相邻组合最大值—动态规划问题)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed(藏着), </span> the onl

leetcode(18)-在排序数组中查找元素

给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是?O(log n) 级别. 如果数组中不存在目标值,返回?[-1, -1]. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处

php中使用array_slice将数组中的元素分类

1 <?php 2 3 //将属于同一个类型的文章划分到同一张卡片上展示,并且保证同一张卡片上的文章在时间上连续 4 //可以先按照时间倒序取出来将文章放到同一个数组中 5 //假设下面的数组是按照时间倒序取出来的各篇文章的类型 6 7 $article_list = ['科技','生活','互联网','互联网','大数据','人工智能','人工智能','人工智能','科技','科技','大数据','自动驾驶']; 8 9 //由于文章已经在时间上连续了,所以只要前一篇和后一篇是不同类型的就可以

有这样一个数组A,大小为n,相邻元素差的绝对值都是1。

有这样一个数组A,大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}.现在,给定A和目标整数t,请找到t在A中的位置.除了依次遍历,还有更好的方法么? 思路:数组第一个数为array[0], 要找的数为y,设t = abs(y - array[0]).由于每个相邻的数字之差的绝对值为1.故第t个位置之前的数肯定都比y小.因此直接定位到array[t],重新计算t,t = abs(y – array[t]),再重复上述步骤即可.这种算法主要利用了当前位置的数与

数组-06. 找出不是两个数组共有的元素(20)

1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int i,j,k=0,l,a[20],b[20],c[40],m,n; 5 cin>>m; 6 for(i=0;i<m;++i) 7 cin>>a[i]; 8 cin>>n; 9 for(j=0;j<n;++j) 10 cin>>b[j]; 11 12 for(i=0;i<m;++i){ 13 for(j=0

[经典面试题][百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数。

题目 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置. 思路 这道题目最差时间复杂度也是O(N),所以重点在于能不能找到一种尽可能减少比较次数的方法. 如数组:[1,2,3,4,3,4,5,6,5],找到4在数组中的位置.4和1比较,差为3,那么即使最好情况(递增或者递减),4也就是在a[3]的位置,可以跳过a[1]a[2].这样在特定数组(目标值和a[1]相差很大)的情况下或许可以